Linux系统进程:Linux守护进程(daemonize linux)

关于Linux系统进程的问题,在daemonize linux中经常遇到, 我正在写一个 Linux 守护进程。我发现了两种方法来做到这一点。

我正在写一个 Linux 守护进程。我发现了两种方法来做到这一点。

通过调用fork()并设置sid来守护进程。

使用&运行程序。

这是正确的方法呢?

84
Fromhttp://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

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

fork (),以便父级可以退出,这将控制返回到命令行或 shell 调用您的程序。这一步是必需的,以便保证新进程不是进程组负责人。如果您是进程组负责人,则下一步 setsid () 将失败。

setsid () 成为进程组和会话组的领导者。由于控制终端与会话相关联,并且此新会话尚未获得控制终端,因此我们的进程现在没有控制终端,这对于守护进程来说是一件好事。

再次使用 fork (),以便父组(会话组组长)可以退出。这意味着作为非会话组组长,我们永远无法重新获得控制终端。

chdir ("/") 来确保我们的进程不保留任何目录。如果不这样做,可能会导致管理员无法卸载文件系统,因为它是我们当前的目录。[同样,我们可以更改为包含对守护程序操作重要的文件的任何目录。]

umask (0),这样我们就可以完全控制我们写的任何东西的权限。我们不知道我们可能继承了什么 umask。[这一步是可选的]

close () fds 0,1 和 2。这释放了我们从父进程继承的标准 in,out 和 error。我们没有办法知道这些 fds 可能被重定向到哪里。请注意,许多守护进程使用 sysconf () 来确定 limit_SC_OPEN_MAX。_SC_OPEN_MAX 告诉你最大打开文件 / 进程。然后在一个循环中,你需要关闭所有可能的描述符

为 stdin 、 stdout 和 stderr 建立新的打开描述符。即使你不打算使用它们,让它们打开仍然是个好主意。这些的精确处理是一个品味问题;例如,如果你有一个日志文件,你可能希望将它打开为 stdout 或 stderr,并打开 '/ dev / null' 作为 stdin / sense;或者,你可以将 '/ dev / console' 作为 stder

更好的是,如果可用,只需调用daemon()函数。

30

我建议不要把你的程序写成一个守护进程。让它在前台运行,文件描述符,当前目录,进程组等。

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

12
Just usedaemon(3)(fromunistd.h).

daemon () 函数是为那些希望脱离控制终端并作为系统守护进程在后台运行的程序准备的。

5

第一个。第二个不是 daemonizing,而是在后台运行。daemonized 程序应该在它自己的会话和进程组上,并且应该not有一个控制终端。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(762)
.vue文件:自动填充 vue文件(kel varnsen)
上一篇
Linux修改网卡速率:linux如何用同一个驱动驱动很多网卡
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(73条)