【问题标题】:Run bash file on remote linux machine with java and keep it in background使用 java 在远程 linux 机器上运行 bash 文件并将其保留在后台
【发布时间】:2019-11-21 17:57:25
【问题描述】:

我在远程 linux 机器上有一个 shell 脚本,其中包含以下内容:

#!/bin/sh
for i in $(seq 1 10);
do
   echo "CREATE TABLE ben$i (id NUMBER NOT NULL);
   ! sleep 30
   select * from ben$i;
   ! sleep 30
   DROP TABLE ben$i;" | sqlplus system/password &
done
wait

这个脚本的名字是ben.sh。

在 java 中,我想执行这个脚本并让脚本在后台执行它的工作。

我有一个成功执行脚本的命令:

sshshell.execute("su - oracle -c './ben.sh'");

我希望脚本仍然在远程 linux 机器上运行,并且我想在执行上述命令后立即关闭 ssh 连接,而不干扰脚本。

我想如果我在这个命令的末尾放一个 & 像这样:

sshshell.execute("su - oracle -c './ben.sh' &");

但java程序仍然卡住并等待脚本完成

非常重要的说明:我不想使用线程或任何其他 ssh 连接。

我有什么选择?

【问题讨论】:

    标签: java linux bash ssh connection


    【解决方案1】:

    使用nohup& 在后台运行脚本。

    sshshell.execute("nohup su - oracle -c './ben.sh' &");
    

    Nohup 是“No Hangups”的缩写。Nohup 是一个补充命令,它告诉 Linux 系统一旦启动就不要停止另一个命令。这意味着它会一直运行直到它完成,即使启动它的用户注销。nohup 的语法如下:

    nohup sh your-script.sh &
    

    末尾的& 将命令移至后台,从而释放您正在使用的终端。

    【讨论】:

      【解决方案2】:

      因此,您可以使用 Nohup 或 Disown 命令。使用 nohup 系统将避免退出信号传播到子进程。

      nohup cmd &
      

      或者您可以使用 Disown 将其与子进程分离。

      cmd & disown
      

      【讨论】:

        猜你喜欢
        • 2014-04-07
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 2012-05-28
        • 2011-06-30
        • 2012-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多