将脚本作为守护进程运行与使用 nohup 相比有什么影响?
我知道在 fork 过程等方面有什么区别,但这对我的脚本有什么影响?
最佳答案
nohup
命令是穷人将进程作为守护进程运行的方式。正如 Bruno Ranschaert 所指出的,当您在交互式 shell 中运行命令时,它有一个控制终端,并且在控制进程(通常是您的登录 shell)退出时会收到一个 SIGHUP(挂断)信号。 nohup
命令安排输入来自 /dev/null
,输出和错误都转到 nohup.out
,程序忽略中断、退出信号和挂断。它实际上仍然具有相同的控制终端——它只是忽略了终端控制。请注意,如果您希望该进程在后台运行,则必须告诉 shell 在后台运行它 - 至少在 Solaris 上(即,您键入“nohup sleep 20 &
”;如果没有&符号,则该进程在前景)。
通常,通过 nohup
运行的进程需要时间,但不会等待来自其他地方的交互。
通常(这意味着如果你努力尝试,你可以找到这些规则的异常(exception)),守护进程是潜伏在后台的东西,与任何终端断开连接,但等待响应某种输入。网络守护进程等待连接请求或 UDP 消息通过网络到达,执行适当的工作并再次发送响应。例如,可以考虑 Web 服务器或 DBMS。
当一个进程完全守护自己时,它会经历 nohup
代码所经历的一些步骤;它重新排列它的 I/O,因此它不连接到任何终端,将自身与进程组分离,忽略适当的信号(这可能意味着它不会忽略任何信号,因为没有终端向它发送任何生成的信号通过终端)。通常,它 fork 一次,并且父级成功退出。子进程通常会在修复其进程组和 session ID 等之后进行第二次 fork;然后 child 也退出了。孙进程现在是自治的,不会出现在启动它的终端的 ps
输出中。
您可以查看 W Richard Stevens 和 Stephen A Rago 的 Advanced Programming in the Unix Environment, 3rd Edn 或 Marc J Rochkind 的 Advanced Unix Programming, 2nd Edn 以讨论守护进程。
我有一个程序 daemonize
,它将守护一个不知道如何(正确)守护自己的程序。编写它是为了解决程序中的缺陷,该程序应该自我守护,但没有正确完成工作。如果需要,请与我联系 - 请参阅我的个人资料。
关于unix - nohup 和守护进程有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/958249/