我有一个bash脚本start.sh,如下所示:
for thing in foo bar; do
{
background_processor $thing
cleanup_on_exit $thing
} &
done
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:我运行start.sh,它以代码0退出,并且两个子shell在后台运行.每个子shell运行background_processor
,当它退出时,它运行cleanup_on_exit
.即使我退出我最初运行start.sh的终端(即使这是一个ssh连接),这也有效.
然后我尝试了这个:
ssh user@host "start.sh"
Run Code Online (Sandbox Code Playgroud)
这是有效的,除了start.sh
退出后,ssh显然也等待子壳退出.我真的不明白为什么.一旦start.sh
退出,子shell变成pid 1的子项,并且它们甚至没有被赋予tty ...所以我无法理解它们如何仍然与我的ssh连接相关联.
我后来试过这个:
ssh -t user@host "start.sh"
Run Code Online (Sandbox Code Playgroud)
现在进程有一个指定的伪tty.现在,我发现ssh一旦start.sh
退出就会退出,但它也会杀死子进程.
我猜想在后一种情况下子进程被发送了SIGHUP,所以我这样做了:
ssh -t user@host "nohup start.sh"
Run Code Online (Sandbox Code Playgroud)
这实际上有效!所以,我有一个解决我的实际问题的方法,但我想在这里掌握SIGHUP/tty的微妙之处.
总之,我的问题是:
start.sh
退出后也等待子进程,即使它们有父pid 1?