nohup命令的功能是什么?


18

我是Ubuntu的新手。我学会了一个命令

nohup [command]- <command>对挂断信号免疫

我无法理解“ 免于挂断信号 ” 的含义。它正在谈论什么类型的信号?并且请通过示例告诉我如何使用此命令。


如果您的外壳中有,disown则是更好的替代方法nohup。使用command &或后台执行命令Ctrl-Z,然后使用将该命令disown从外壳分离。
约翰·库格曼

@JohnKugelman 还不够,您也已经转移了输入,输出和错误流。那么,为什么不使用自动为您执行此操作的“ nohup”呢?
miracle173

Answers:


34

让我们考虑一下,您已经gedit从终端打开了 文本编辑器并正在使用它。如果您在关闭终端之前先关闭终端gedit,则gedit也会在关闭终端后立即关闭。那么这是怎么回事?在gedit运行作为终端下一个子进程。当您关闭终端时,挂断信号SIGHUP)被发送到该进程,该进程终止子进程。

另一方面,如果您希望子进程(在此处gedit)即使在关闭父终端后仍继续运行,则希望您的进程不受挂断信号的影响。这样关闭终端不会关闭子进程。nohup确实完成了这项工作。

nohup不会从终端断开命令,它会使脚本忽略SIGHUP,并将stdout / stderr重定向到文件nohup.out,以便注销后该命令可以在后台继续运行。如果关闭外壳程序/终端或注销,则命令不再是该外壳程序的子级。它属于init进程。如果您进行搜索,pstree您将看到它现在归进程1(init)所有。由于前景不再存在,因此无法将其带回前景。


16

除了@sourvac所写的内容外,这是Back In The Day的遗产,当时人们通过纯文本哑终端(通常是通过原始的模拟110波特)调制解调器登录:“挂断”实际上是“挂断电话” ”。

即使您注销并挂断电话后,不受挂断信号影响的 pid 仍将继续运行。这在慢速的计算机上非常有用,当作业数小时运行数小时,并且您不能仅保持登录状态(其他人需要使用终端,您需要使用电话,线路中的静态状态可能会“模糊”连接)等)。


1
不只是回到一天。我的大部分大型作业都在ssh所在的服务器群集上运行。如果我不使用nohup,则需要在等待作业完成的同时将笔记本电脑与这些计算机连接几天。

@Ray如何通过“ at”或cron作业运行它们?
罗恩

@RonJohn当然。或通过网格引擎。我并不是要暗示nohup是唯一的选择,只是今天它仍被用于此目的。

1
也许您的历史言论是正确的。但是您关于其当前重要性的结论是错误的。它在运行缓慢的计算机上无济于事,但对于长时间运行的作业却很有用。这是两件事。您可以使用“ nohup”来保护您的工作,以防止终端有意或无意地断开连接。即使在当今,如果作业中止也是您不满意的,因为网络错误会断开您的终端并导致您的作业中止。
miracle173

@Ray Cron工作完全不适合实现这一目标。Cronjobs用于定期任务,您必须在cronjob中设置环境并考虑很多其他事项。也许“ at”比nohup易于处理,但更为复杂。
miracle173
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.