代码之家  ›  专栏  ›  技术社区  ›  Hortitude

nohup和daemon有什么区别?

  •  53
  • Hortitude  · 技术社区  · 15 年前

    将脚本作为守护进程运行与使用nohup有什么关系?

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

    4 回复  |  直到 6 年前
        1
  •  69
  •   Jonathan Leffler    9 年前

    这个 nohup 命令是穷人以守护进程的形式运行进程的方式。正如Bruno Transchaert所指出的,当您在交互shell中运行命令时,它有一个控制终端,当控制进程(通常是您的登录shell)退出时,它将收到一个叹息(挂断)信号。这个 诺胡普 命令安排输入来自 /dev/null ,对于输出和错误,请转到 nohup.out ,并使程序忽略中断、退出信号和挂断。它实际上仍然有相同的控制终端——它只是忽略了终端控制。请注意,如果希望进程在后台运行,则必须告诉shell在后台运行它,至少在Solaris上运行(即,键入' nohup sleep 20 & ';如果没有和号,进程将在前台同步运行)。

    通常,流程通过 诺胡普 是需要时间的东西,但它不会停留在等待来自其他地方的交互。

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

    当进程完全监控自身时,它将执行 诺胡普 代码通过;它重新排列其I/O,使其不连接到任何终端,将自身从进程组中分离,忽略适当的信号(这可能意味着它不忽略任何信号,因为没有终端将通过终端生成的任何信号发送给它)。通常,它分叉一次,父级成功退出。子进程通常在修复其进程组和会话ID等之后再次分叉;然后子进程也退出。孙儿进程现在是自主的,不会出现在 ps 启动终端的输出。

    你可以看看 Advanced Programming in the Unix Environment, 3rd Edn 作者:W Richard Stevens和Stephen A Rago,或 Advanced Unix Programming, 2nd Edn 作者:Marc J Rochkind,关于守护进程的讨论。

    我有个节目单 daemonize 它将监视一个不知道如何(正确地)监视自身的程序。它是为解决程序中的缺陷而编写的,该程序本来应该对自身进行后台监控,但没有正确地完成任务。如果需要,请联系我-查看我的个人资料。

        2
  •  41
  •   Kelvin    6 年前

    成为一个守护进程

    此链接列出了进程成为守护程序时应采取的步骤:

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

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

    1. fork (第一次)--所以我们不是组长,让家长离开。
    2. 呼叫 setsid() --成为新会议的领导人。只有当我们不是组长时,此呼叫才有效。这个新会话没有控制终端。
    3. (第二次)--所以我们不是会话领导者(因此无法重新获得控制终端),让父级退出。
    4. cd 到根目录——所以我们不会阻止其他目录被umount-ed。
    5. 设置 umask 到所需的值(可选)--因为我们可能继承了一个不需要的掩码。
    6. 关闭stdin、stdout、stderr(或重新打开它们指向其他地方)

    诺胡普

    什么 nohup 做:

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

    异同

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

    诺胡普 不需要您使用' & '以后台处理-这意味着您仍然可以使用ctrl-c发送sigint。这个过程仍然响应键盘输入。它也不会自动更改stdin,因此建议您通过 < /dev/null “。

    请不要混淆 诺胡普 其他通常与之一起使用的功能(例如,后接地)。手术室特别询问 诺胡普 .

    在实践中

    在实用性方面,当您想要启动一个一次性的长时间运行的进程时,这个进程应该在shell退出时继续运行,您需要使用 诺胡普 ,但您还需要将其与stdin的后台和重定向结合起来。一次性作业不值得创建守护程序,但守护程序的某些属性对于nohup作业仍然有用,例如“ cd / “。

    定期计划中的定期任务最好通过 cron (或其他调度程序)。

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

    控制终端附录

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

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

        3
  •  7
  •   Bruno Ranschaert    15 年前

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

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

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

        4
  •  -1
  •   Scott    13 年前

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