以交互方式运行后sleep 10 &
立即关闭运行该命令的终端,该sleep
命令将在 10 秒之前终止。
但是当这个命令被放入脚本时:
# this is a file named testfile.sh
sleep 10 &
然后作为执行bash testfile.sh
,sleep
即使终端关闭后,命令仍会持续执行直至完成。
为什么在一种情况下sleep
终端关闭后立即停止,而在另一种情况下它继续执行?
以交互方式运行后sleep 10 &
立即关闭运行该命令的终端,该sleep
命令将在 10 秒之前终止。
但是当这个命令被放入脚本时:
# this is a file named testfile.sh
sleep 10 &
然后作为执行bash testfile.sh
,sleep
即使终端关闭后,命令仍会持续执行直至完成。
为什么在一种情况下sleep
终端关闭后立即停止,而在另一种情况下它继续执行?
在 Bash 中,
&
启动一个后台作业。当你关闭终端窗口时,终端仿真器会向 Bash 发送 SIGHUP 信号,Bash 随后会将该信号转发给所有作业,具体说明如下man bash
:SIGHUP 的默认操作是终止进程,如下所述
man 7 signal
:但是当您
sleep 10 &
在脚本中运行使用时bash testfile.sh
,您不会运行作业,并且当父进程(脚本)退出时,睡眠进程将失去其父进程,由 init(PID 1)采用并继续:当 Bash 收到 SIGHUP 时,它不会将其转发到后台作业,因为没有任何后台作业 - testfile.sh 尚未运行,
&
而 sleep 甚至不再是其后代进程之一。