Linux守护进程

Poo*_*rna 46 linux daemon

我正在写一个Linux守护进程.我发现了两种方法.

  1. 通过调用fork()和设置来守护您的过程sid.
  2. 用你的程序运行&.

这是正确的方法吗?

nos*_*nos 78

来自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

以下是成为守护进程的步骤:

  1. fork()所以父进程可以退出,这会将控制权返回给命令行或shell来调用你的程序.此步骤是必需的,以确保新流程不会成为流程组负责人.如果您是流程组负责人,则下一步setsid()将失败.
  2. setsid()成为进程组和会话组的领导者.由于控制终端与会话相关联,并且该新会话尚未获得控制终端,因此我们的进程现在没有控制终端,这对守护进程来说是一件好事.
  3. fork()再次使父进程(会话组负责人)可以退出.这意味着我们作为非会议组长,永远无法重新获得控制终端.
  4. chdir("/")以确保我们的进程不会保留任何目录.如果不这样做,可能会导致管理员无法卸载文件系统,因为它是我们当前的目录.[等效地,我们可以更改为包含对守护程序操作重要的文件的任何目录.
  5. umask(0),这样我们就可以完全控制我们编写的任何内容的权限.我们不知道我们可能继承了什么umask.[此步骤是可选的]
  6. close()fds 0,1和2.这将释放我们从父进程继承的标准输入,输出和错误.我们无法知道这些fds可能被重定向到哪里.请注意,许多守护程序使用sysconf()来确定限制_SC_OPEN_MAX._SC_OPEN_MAX告诉您最大化打开文件/进程.然后在循环中,守护进程可以关闭所有可能的文件描述符.您必须决定是否需要这样做.如果您认为可能存在文件描述符打开,则应关闭它们,因为并发文件描述符的数量有限制.
  7. 为stdin,stdout和stderr建立新的开放描述符.即使您不打算使用它们,打开它们仍然是个好主意.精确处理这些是一个品味问题; 例如,如果你有一个日志文件,你可能希望将其打开为stdout或stderr,并打开'/ dev/null'作为stdin; 或者,您可以将'/ dev/console'打开为stderr和/或stdout,将'/ dev/null'打开为stdin,或者对您的特定守护进程有意义的任何其他组合.

更好的是,只要调用daemon()函数,就可以调用它.

  • @ n-alexanderso - 是daemon()双叉吗? (2认同)

cam*_*amh 29

我建议不要把你的程序写成守护进程.使其在前台运行,并提供给定的文件描述符,当前目录,进程组等.

如果您想将此程序作为守护程序运行,请使用start-stop-daemon(8),init(8),runsv(来自runit),upstart,systemd或其他任何内容作为守护程序启动进程.也就是说,让您的用户决定如何运行您的程序,并且不强制它必须作为守护程序运行.

  • +1.至少,提供在前台运行的选项. (7认同)

jkr*_*mer 12

只需使用daemon(3)(从unistd.h).

守护进程()函数用于希望从控制终端分离并在后台作为系统守护进程运行的程序....


nin*_*alj 5

首先.第二个不是守护进程,而是在后台运行.守护进程的程序应该是在它自己的会话和进程组,并且应该不会有一个控制终端.