问题

问题

问题

我通过 ssh 调用一个长时间运行的进程。并且必须确保此进程不会被终止。用户可能会终止其主机上的初始进程,而我对此无能为力。

如果初始进程被终止,如何确保远程进程不被终止?

User -> user.sh -> SSH-to-remote -> long-running.sh

它必须:

  1. 输出远程进程的输出
  2. 当远程进程退出时退出
  3. 当初始进程被终止时,不要终止远程进程
  4. 使输出日志文件可用

第一个不完整的解决方案

我想过使用 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,但不会终止长时间运行的进程。

相关内容