关闭ssh连接后在后台通过java执行bash脚本

tot*_*eat 5 java linux parallel-processing ssh bash

我正在使用 java 在远程 linux 机器上执行一个简单的 bash 脚本。

名为“shortoracle.bash”的 bash 脚本有这个脚本:

#!/bin/sh
runsql() {
   i="$1"
   end=$((SECONDS+360))
   SECONDS=0
   while (( SECONDS < end )); do
   echo "INSERT into table_$i (col1) values (CURRENT_TIMESTAMP);" | sqlplus username/password
   sleep 1
   done
}


for i in $(seq 1 10); do
 echo "DROP TABLE table_$i;" | sqlplus username/password
 echo "CREATE TABLE table_$i (col1 TIMESTAMP WITH TIME ZONE);" | sqlplus username/password
 runsql $i &
done
wait
Run Code Online (Sandbox Code Playgroud)

简单来说:创建 10 个并行连接,执行 360 秒的查询。

从我的 Java 程序中,我执行以下命令:

sshconnection.execute("nohup su - oracle -c './shortoracle.bash'",2000);
Run Code Online (Sandbox Code Playgroud)

ssh 成功执行脚本。

我想,在 2 秒(第二个参数)超时后终止 ssh 连接,但是为了让脚本继续在后台正常运行(因此 nohup,或者我认为),它不会发生:

当我终止 sshconnection 2 秒后,bash 程序停止工作:

  • 10 个连接中只有 3 个打开。

  • 没有更多的插入发生。

如果我给连接一个更长的超时时间,一切都会顺利,但我不想挂断这个特定的连接,我需要继续执行程序。

我在这里做错了什么?

Sve*_*ort 2

您应该&在命令后添加,即

sshconnection.execute("nohup su - oracle -c './shortoracle.bash' &",2000);

否则,当您关闭 SSH 连接时,nohup 本身就会断开连接。您&在后台运行“nohup”本身,因此允许它在关闭 SSH 连接后继续运行。

希望这可以帮助你!