与使用nohup相比,将脚本作为守护进程运行会有什么影响?
我知道在分叉过程等方面有什么区别,但是对我的脚本有什么影响?
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它将daemonize一个程序,不知道如何daemonize自己(正确)。它被编写来解决一个程序中的缺陷,该程序应该自己守护进程,但没有正常工作。如果你想要联系我 – 见我的个人资料。