nohup和守护进程有什么区别?

时间:2009-06-05 21:30:58

标签: unix daemon

将脚本作为守护程序运行与使用nohup相比有什么影响?

我知道在分叉过程等方面有什么不同,但这会对我的脚本产生什么影响?

4 个答案:

答案 0 :(得分:69)

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,它将守护程序,该程序不知道如何守护自己(正确)。它是为了解决一个程序中的缺陷而编写的,该程序本应该守护自己,但没有正确地完成工作。如果您需要,请与我联系 - 请参阅我的个人资料。

答案 1 :(得分:42)

成为守护进程

此链接包含一个流程在成为守护程序时应采取的良好步骤列表:

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

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

  1. fork(第一次) - 所以我们不是小组组长,让父母离开。
  2. 致电setsid() - 成为新会议的领导者。此呼叫仅在我们不是组长时才有效。这个新会议没有控制终端。
  3. fork(第二次) - 所以我们不是会议领导者(因此无法重新获得控制终端),并让父母退出。
  4. cd到根目录 - 因此我们不会阻止其他目录被卸载。
  5. umask设置为所需的值(可选) - 因为我们可以继承我们不想要的掩码。
  6. 关闭stdin,stdout,stderr(或者只是重新打开它们指向别处)
  7. <强> nohup的

    nohup做了什么:

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

    异同

    注意唯一的常见操作是如何重定向stdout和stderr。 成为一个守护进程甚至不需要忽略SIGHUP。

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

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

    在实践中

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

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

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

    关于控制终端的附录

    this page。一个简短的总结是控制终端授予对stdin,stdout,stderr的无限制访问权限。只有一个进程组可以访问stdin。默认情况下,后台进程组也可以写入stdout和stderr。

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

答案 2 :(得分:8)

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

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

如果您可以以用户身份访问系统,则可以使用nohup。如果您是sysadmin,则可以安装deamon进程。对于这个过程并不重要。

答案 3 :(得分:-1)

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