这更像是一个进程管理/信号处理问题,而不是 Bash 问题。它只是使用 Bash 来解释问题。
我正在运行一个 Bash 脚本,在其中运行后台进程。这是脚本:
#!/bin/bash
# ...
# The background process
{
while :; do
sleep 1 && echo foo >> /path/to/some/file.txt
done
} &
# ...
exit 0
我不会在后台运行脚本本身。简单地./script
。
“huponexit”shell 选项是使用 启用的shopt -s huponexit
,因此当终端关闭时,我希望它向 Bash 发送一个 HUP 信号,该信号将传播它直到它到达后台进程。如果后台进程不会trap
并忽略该信号,它也会被杀死 - 但这并没有发生。后台进程的行为就像是disown
“ed”一样。
这是我为了说明这个问题而画的一个方案。该方案以及上面的描述可能是错误的,因为我确信我对这个主题的理解不够好。如果确实如此,请帮我解决这个问题。
我想知道为什么后台进程在关闭终端后没有被终止,就好像它是由这样的交互式 shell 调用的:
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
我不确定,但我想我的问题的答案在于 Bash fork() 是一个非交互式 shell 来运行脚本,该脚本可能有一组不同的作业控制和信号处理规则。
答案1
那么手册页告诉我们什么huponexit
?
如果已使用 shopt 设置了 huponexit shell 选项,则当出现以下情况时,bash 会向所有作业发送 SIGHUP:交互式登录外壳退出。
编辑:强调它是一个登录外壳。
编辑2:交互性值得同等重视