我无法理解使用nohup运行脚本和使用nohup和'&'之间的区别。我明白,对于后者,如果我想要杀死它,我可以杀死进程ID。但对于前者,我可以点击“CTRL + C”来杀死脚本。所以,如果我要运行以下命令
nohup sh script.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将术语信号发送到前台进程,而不是后台进程。
是。 &的优点是你不必按Ctrl + C参见例如https://www.computerhope.com/unix/unohup.htm