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 个打开。
没有更多的插入发生。
如果我给连接一个更长的超时时间,一切都会顺利,但我不想挂断这个特定的连接,我需要继续执行程序。
我在这里做错了什么?
您应该&
在命令后添加,即
sshconnection.execute("nohup su - oracle -c './shortoracle.bash' &",2000);
否则,当您关闭 SSH 连接时,nohup 本身就会断开连接。您&
在后台运行“nohup”本身,因此允许它在关闭 SSH 连接后继续运行。
希望这可以帮助你!