首页 > 解决方案 > 使用 java 在远程 linux 机器上运行 bash 文件并将其保留在后台

问题描述

我在远程 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 连接。

我在这里有什么选择?

标签: javalinuxbashsshconnection

解决方案


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

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

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

nohup sh your-script.sh &

最后&的 将命令移动到后台,释放您正在使用的终端。


推荐阅读