67

将脚本作为守护进程运行与使用 nohup 有何含义?

我知道在分叉进程等方面有什么区别,但这对我的脚本有什么影响?

4

4 回答 4

81

nohup命令是穷人将进程作为守护进程运行的方式。正如 Bruno Ranschaert 所指出的,当您在交互式 shell 中运行命令时,它有一个控制终端,并且在控制进程(通常是您的登录 shell)退出时会收到一个 SIGHUP(挂断)信号。该nohup命令安排输入来自/dev/null,输出和错误都转到nohup.out,并让程序忽略中断、退出信号和挂断。它实际上仍然具有相同的控制终端 - 它只是忽略了终端控件。请注意,如果您希望进程在后台运行,则必须告诉 shell 在后台运行它 - 至少在 Solaris 上(也就是说,您输入 ' nohup sleep 20 &';如果没有 & 符号,则进程在前台同步运行)。

通常,一个进程运行通过nohup是需要时间的东西,但它不会等待来自其他地方的交互。

通常(这意味着如果你努力,你可以找到这些规则的例外),守护进程是潜伏在后台的东西,与任何终端断开连接,但等待响应某种输入。网络守护进程等待连接请求或 UDP 消息通过网络到达,执行适当的工作并再次发送回响应。例如,考虑 Web 服务器或 DBMS。

当一个进程完全守护自己时,它会经历nohup代码经历的一些步骤;它重新排列其 I/O,因此它不连接到任何终端,将自身与进程组分离,忽略适当的信号(这可能意味着它不会忽略任何信号,因为没有终端向它发送任何生成的信号通过终端)。通常,它分叉一次,并且父级成功退出。子进程通常在固定其进程组和会话 ID 等之后进行第二次分叉;然后孩子也退出了。孙子进程现在是自主的,不会显示在ps启动它的终端的输出中。

您可以查看W Richard Stevens 和 Stephen A Rago编写的 Advanced Programming in the Unix Env​​ironment, 3rd Edn ,或查看Marc J Rochkind编写的Advanced Unix Programming, 2nd Edn讨论守护进程。

我有一个程序daemonize,它将守护一个不知道如何(正确地)守护自己的程序。它是为解决程序中的缺陷而编写的,该程序本应自行守护但没有正确完成工作。如果需要,请与我联系 - 查看我的个人资料。

于 2009-06-05T22:36:18.580 回答
47

成为守护进程

这个链接有一个很好的步骤列表,一个进程在成为一个守护进程时应该采取的步骤:

https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

由于版权原因,我无法逐字复制列表(请参阅“关于”部分),但这是摘要:

  1. fork(第一次)——所以我们不是组长,让家长退出。
  2. call setsid()- 成为新会话的领导者。仅当我们不是组长时,此调用才有效。这个新会话没有控制终端。
  3. fork(第二次)——所以我们不是会话负责人(因此无法重新获得控制终端),让父级退出。
  4. cd到根目录——所以我们不会阻止其他目录被卸载。
  5. 设置umask为期望值(可选)——因为我们可以继承我们不想要的掩码。
  6. 关闭标准输入、标准输出、标准错误(或者只是重新打开它们以指向其他地方)

诺哈普

有什么nohup作用:

  • 如果 stdout 和 stderr 连接到终端,则将它们重定向到nohup.out
  • 忽略 SIGHUP

共同点和不同点

请注意唯一常见的操作是如何重定向标准输出和标准错误。成为守护进程甚至不需要忽略 SIGHUP。

nohup不需要您使用 ' &' 来后台处理进程 - 这意味着您仍然可以使用 ctrl-c 发送 SIGINT。该进程仍然响应键盘输入。它也不会自动更改标准输入,因此建议您通过“ < /dev/null”自行更改。

请不要nohup与通常与它一起使用的其他功能(例如背景)混淆。OP专门询问了nohup.

在实践中

就实用性而言,当您想要启动一个在 shell 退出时应该继续的一次性长时间运行的进程时,您会想要使用nohup,但您还需要将它与 stdin 的后台和重定向结合起来。一次性作业不值得制作守护进程,但守护进程的某些属性仍然可以用于 nohup 作业,例如“ cd /”。

定期安排的定期任务最好通过cron(或其他一些调度程序)运行。

守护进程最适合监督没有可预测开始时间的重复任务。守护进程通常没有明确的结束时间(它由用户/另一个进程或系统关闭显式停止)。守护进程通常是响应应用程序(客户端)或其他条件(例如,通过 IO 设备通过 unix select() 传入数据)的服务。其他守护程序轮询条件并执行响应操作。

关于控制终端的附录

请参阅此页面。简要总结一下,控制终端授予对其标准输入、标准输出、标准错误的无限制访问权限。只有一个进程组可以访问标准输入。默认情况下,后台进程组也可以写入 stdout 和 stderr。

此外,似乎发送到终端的键盘信号仅发送到将其作为控制终端的进程组。

于 2012-01-18T18:05:15.570 回答
8

在 UNIX 变体中,进程与终端进程(登录 shell)相关联。因此,当终端进程退出时,由于这种关联,进程也会停止。nohup 可防止在终端停止时退出进程。

守护进程或恶魔是系统启动时启动的进程,它一直运行到关闭,没有用户明确要求它。因此,根据定义,它不是用户交互的一部分,而是属于系统。

如果您以用户身份访问系统,则可以使用 nohup。如果你是系统管理员,你可以安装一个守护进程。对于过程来说,这并不重要。

于 2009-06-05T22:05:12.623 回答
-1

无法启动守护进程,而 nohup 由用户启动。

于 2010-08-10T12:55:04.123 回答