后台子进程是否随父进程终止?脚本场景验证咨询
确认:用
&后台运行子脚本确实可行! 没错,你记的方法完全正确——在调用子脚本时加上&让它后台运行,就能避免父脚本终止时子进程被连带终止。不过为了让你更清楚背后的逻辑,以及应对更复杂的场景,我再展开说说:
为什么直接调用会跟着终止?
当你在父脚本里直接写./child.sh时,子脚本进程是父进程的前台子进程,二者属于同一个进程组。一旦父进程被终止,操作系统会向整个进程组发送终止信号(比如SIGHUP),导致子进程也跟着退出。
加&之后发生了什么?
用./child.sh &启动子脚本后,子进程会脱离父进程的前台进程组,成为独立的后台进程。当父进程终止时,子进程会被系统的init(或systemd)进程接管,变成“孤儿进程”,不会再因为父进程的退出而收到终止信号,因此能继续运行。
更稳妥的进阶方案
如果你的子进程需要长期稳定运行,或者担心它意外收到SIGHUP信号,还可以搭配以下方式:
- 用
nohup忽略SIGHUP:
这个命令会让子进程忽略nohup ./child.sh &SIGHUP信号,同时把默认输出重定向到nohup.out文件,避免因终端关闭或父进程退出导致进程终止。 - 用
disown脱离shell作业管理:
先后台启动子进程,再用disown把它从shell的作业列表中移除:
这样即使父shell退出,也不会给这个子进程发送./child.sh & disown %1 # %1是后台作业的编号,可通过jobs命令查看SIGHUP信号。
总结
- 单纯加
&后台运行已经能满足你“父脚本终止后子进程不终止”的核心需求; - 如果需要更高的稳定性,搭配
nohup或disown会更保险。
内容的提问来源于stack exchange,提问作者Philip Kirkbride
相关产品推荐
相关产品推荐

