2009-06-05 36 views

回答

64

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 Environment, 3rd Edn,或Marc J Rochkind的Advanced Unix Programming, 2nd Edn讨论守护进程。

我有一个程序daemonize它将守护程序,不知道如何守护自己(正确)。它是为了解决一个程序中的缺陷而设计的,该程序本来是为了自我牺牲,但没有正确地完成这项工作。联系我,如果你想要它 - 看我的个人资料。

6

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

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

如果您可以作为用户访问系统,则可以使用nohup。如果你是系统管理员,你可以安装一个deamon进程。对于这个过程并不重要。

+0

+1我纠正了。在守护进程和后台进程(&)之间混淆起来。 :) – pugmarx 2009-06-05 22:10:12

+1

几乎正确。当控制进程(组长)退出组中的所有进程时,可以选择发送SIGHUP,然后选择SIGCONT。 – 2011-10-04 09:04:47

+5

一些更正:守护进程不需要是系统进程;一个非特权用户可以运行一个守护进程。用户可以与守护进程进行交互,而不是通过终端信号和IO流(认为web服务器)。守护进程几乎可以随时启动;他们不限于系统启动。 – Kelvin 2012-01-18 18:38:07

-1

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

36

成为一个守护进程

这个环节有步骤的过程应该在成为一个守护进程良好的名单: http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

我不能逐字复制,因为版权的列表(见关于部分),但这里的总结:

  1. fork(第一次) - 所以我们不是组长,并让家长退出。
  2. 致电setsid() - 成为新会议的领导者。只有当我们不是小组组长时,此电话才有效。这个新的会议没有控制终端。
  3. fork(第二次) - 所以我们不是会议的领导者(因此不能重新获得控制终端),并让父母退出。
  4. cd到根目录 - 所以我们不阻止其他目录被卸载。
  5. umask设置为期望值(可选) - 因为我们可以继承我们不想要的掩码。
  6. 接近标准输入,标准输出,标准错误(或者只是重新打开它们到别处点)

nohup的

什么nohup作用:

  • 如果输出和错误连接到终端,将它们重定向到nohup.out
  • 忽略SIGHUP

异同

注意唯一共同的行动是如何重定向输出和错误。 作为守护进程甚至不需要忽略SIGHUP。

nohup不要求您使用'&'来背景进程 - 意味着您仍然可以使用ctrl-c发送SIGINT。该过程仍然响应键盘输入。它也不会自动更改stdin,因此建议您通过“< /dev/null”自行完成。

请不要混淆nohup与通常使用它的其他功能(例如背景)。 OP特意询问nohup

在实践

在实用性,当你想开始一个长时间运行的进程应继续当shell退出,你需要使用nohup的条款,但你会也想将它与stdin的背景和重定向结合起来。一次性工作不值得制作一个守护进程,但守护进程的某些属性对于nohup作业仍然有用,例如“cd /”。

定期计划的定期任务最好通过cron(或某个其他计划程序)运行。

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

补遗有关控制终端

参见this page。一个简短的总结是控制终端无限制地访问它的stdin,stdout,stderr。只有一个进程组可以访问stdin。默认情况下,后台进程组也可以写入标准输出和标准错误。

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