当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《nohup和守护进程有什么区别?》经验,为你挑选了3个好方法。

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

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



1> Jonathan Lef..:

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启动它的终端的输出中.

您可以查看Unix环境中的高级编程, W Richard Stevens和Stephen A Rago 撰写的第3版Edn,或者Marc J Rochkind的Advanced Unix Programming,2nd Edn,以了解守护进程的讨论.

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


不知道为什么你称之为穷人.如果你想让你的进程成为一个守护进程,它是正确的,除了它不会与控制终端断开连接,这在实践中并不重要.其次,你说错了,正确的形式是`(nohup sleep 20&)`,即parens将它与进程组领导断开,以便它不接收该进程组的信号.
@Kelvin:`(nohup sleep 20&)中的括号确实有所作为.它们指定了一个子shell.在子shell中,`nohup`命令在后台执行`sleep`命令.当它返回时,子shell退出,因此`sleep`是孤立的,不再被当前shell"拥有".

2> Kelvin..:

成为一个守护进程

这个链接有一个很好的进程列表,一个进程应该成为一个守护进程:

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

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

    fork (第一次) - 所以我们不是团队领导者,让父母退出.

    电话setsid()- 成为新会议的领导者.此呼叫仅在我们不是组长时才有效.这个新会议没有控制终端.

    fork (第二次) - 所以我们不是会话领导者(因此无法重新获得控制终端),并让父母退出.

    cd 到根目录 - 所以我们不阻止其他目录被卸载.

    设置umask为所需的值(可选) - 因为我们可以继承我们不想要的掩码.

    关闭stdin,stdout,stderr(或者只是重新打开它们指向其他地方)

nohup的

什么nohup:

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

忽略了SIGHUP


共同点和不同点

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

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

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

在实践中

在实用性方面,当你想要启动一个一次性的长时间运行的进程,它应该在shell退出时继续,你将要使用nohup,但你也想要将它与stdin的后台和重定向结合起来.一次性工作不值得制作一个守护进程,但守护进程的某些属性对于nohup作业仍然有用,比如" cd /".

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

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

关于控制终端的补遗

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

而且,似乎发送到终端的键盘信号仅被发送到将其作为控制终端的进程组.



3> Bruno Ransch..:

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

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

如果您可以以用户身份访问系统,则可以使用nohup.如果您是sysadmin,则可以安装deamon进程.对于这个过程来说无关紧要.


一些更正:守护进程不需要是系统进程; 非特权用户可以运行守护程序.用户可以与守护进程交互,而不是通过终端信号和IO流(想想Web服务器).守护进程几乎可以随时启动; 它们不仅限于系统启动.
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有