问题
我通过 ssh 调用一个长时间运行的进程。并且必须确保此进程不会被终止。用户可能会终止其主机上的初始进程,而我对此无能为力。
如果初始进程被终止,如何确保远程进程不被终止?
User -> user.sh -> SSH-to-remote -> long-running.sh
它必须:
- 输出远程进程的输出
- 当远程进程退出时退出
- 当初始进程被终止时,不要终止远程进程
- 使输出日志文件可用
第一个不完整的解决方案
我想过使用 nohup 但到目前为止还没有效果:
User -> user.sh -> SSH-to-remote -> init.sh -> long-running.sh
初始化脚本
#!/bin/bash
nohup ./long-running.sh >out.log 2>&1 </dev/null &
pid=$!
disown $pid
tail -f out.log &
wait $pid
long-running.sh(测试内容)
#!/bin/bash
for i in $(seq 30)
do
echo $i
sleep 1
done
此解决方案不能解决问题 2。当远程进程退出时它也不会退出。
答案1
看来我找到解决办法了。
初始化脚本
#!/bin/bash
nohup ./long-running.sh >out.log 2>&1 </dev/null &
pid=$!
disown $pid
tail --pid=$pid -f out.log
在我的第一个解决方案中,wait
没有等待,因为disown
删除了 jobspec。tail
永远运行并保持会话打开。
现在wait
已被删除并tail
等待进程退出。来自源主机的终止操作会终止 tail,但不会终止长时间运行的进程。