我无法理解仅使用 nohup 运行脚本与使用 nohup 和“&”之间的区别。我理解对于后者,如果我想杀死它,我可以杀死进程id。但是对于前者,我可以按“CTRL+C”来终止脚本吗?所以如果我要运行下面的命令
nohup sh 脚本.sh
然后按“CTRL+C”退出它,该脚本是否仍在运行?
如果你能理解发生了什么就更好了。
nohup设置忽略HUP信号的过程。就这样。仅此而已。进程什么时候收到HUP信号?通常在终端注销时。对HUP信号的默认操作是终止。
hitting "CTRL+C"只是向INT进程发送信号。默认操作(您也可以trap "echo something" INT覆盖它)是终止进程。
nohup sh script.sh接收到INT信号后将终止(假设script.sh没有专门处理INT信号),因为它没有在接收INT信号时设置自定义操作,它将忽略HUP信号。
的&在后台置于命令之后运行它。作为一个单独的过程。所以在后台sh script.sh &运行sh。如果您向它发送INT信号,该进程仍将终止,只是CTRL+C不将其发送到该进程,而是处理在前台的进程。您仍然可以使用kill命令发送它。当终端退出时,当进程接收到HUP信号时,该命令仍将终止。
所以运行nohup sh script.sh &会在后台运行进程并忽略终端退出时发送的信号。但它仍然会在接收INT信号时终止。只是按下CTRL+C终端不会将它发送到这个进程,因为 shell 将术语信号发送到前台进程,而不是后台进程。