unix nohup和daemon有什么区别?

xnifntxz  于 2023-10-18  发布在  Unix
关注(0)|答案(4)|浏览(154)

将脚本作为守护进程运行与使用nohup相比有什么含义?
我知道分叉过程等方面的区别,但这对我的脚本有什么影响?

mrfwxfqh

mrfwxfqh1#

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,它将守护一个程序,不知道如何守护自己(正确)。它是为了解决一个程序中的缺陷而写的,这个程序应该是守护进程,但没有正确地完成这项工作。如果你想要的话,请联系我-查看我的个人资料。

ny6fqffe

ny6fqffe2#

成为精灵

这个链接有一个很好的列表,列出了一个进程成为守护进程应该采取的步骤:
https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
由于版权原因,我不能逐字复制列表(请参阅关于部分),但这里是摘要:

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

nohup

nohup的作用:

  • 如果stdout和stderr连接到终端,则将它们重定向到nohup.out
  • 忽略SIGHUP
    相似性和差异性

请注意,唯一的常见操作是重定向stdout和stderr。成为守护进程甚至不需要忽略SIGHUP。
nohup不需要你使用'&'来后台处理-这意味着你仍然可以使用ctrl-c来发送SIGINT。该过程仍然响应键盘输入。它也不会自动更改标准输入,因此建议您通过“< /dev/null“自行更改。
请不要将nohup与通常使用的其他功能(例如,backgrounding)。我问了nohup

在实践中

就实用性而言,当你想启动一个一次性的长时间运行的进程,并在shell退出时继续运行时,你会想使用nohup,但你也会想将它与stdin的后台和重定向结合起来。一次性作业不值得创建守护进程,但守护进程的某些属性对于nohup作业仍然有用,例如“cd /“。
定期调度的周期性任务最好通过cron(或其他调度程序)运行。
守护进程最适合监督没有可预测开始时间的重复任务。守护进程通常没有明确的结束时间(它被用户/另一个进程或系统关闭显式停止)。守护进程通常是响应应用程序(客户端)或其他条件(例如,通过unix select()在IO设备上输入数据)。其他守护进程轮询条件并执行响应操作。

关于控制终端的附录

请参阅此页。简单地说,控制终端赠款对其stdin、stdout、stderr的无限制访问。只有一个进程组可以访问stdin。默认情况下,后台进程组也可以写入stdout和stderr。
而且,似乎发送到终端的键盘信号只发送到将其作为控制终端的进程组。

8oomwypt

8oomwypt3#

在UNIX变体中,进程与终端进程(登录shell)相关联。因此,当终端进程退出时,由于这种关联,该进程也会停止。nohup阻止进程在终端停止时退出。
daemon或demon是系统启动时启动的进程,它一直运行到关机,没有用户明确要求它。因此,根据定义,它不是用户交互的一部分,而是属于系统。
如果您可以作为用户访问系统,则可以使用nohup。如果你是系统管理员,你可以安装一个守护进程。对于过程来说,这并不重要。

m1m5dgzv

m1m5dgzv4#

守护进程不能启动,而nohup由用户启动。

相关问题