Linux 守护进程
- 2024-10-17 08:47:00
- admin 原创
- 66
问题描述:
我正在编写一个 Linux 守护进程。我发现了两种方法来实现它。
fork()
通过调用和设置来守护您的进程sid
。使用 运行你的程序
&
。
哪种方法才是正确的?
解决方案 1:
摘自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16
以下是成为守护进程的步骤:
fork() 以便父进程可以退出,这会将控制权返回到调用程序的命令行或 shell。此步骤是必需的,以便保证新进程不是进程组负责人。如果您是进程组负责人,则下一步 setsid() 会失败。
setsid() 成为进程组和会话组领导者。由于控制终端与会话相关联,并且此新会话尚未获取控制终端,因此我们的进程现在没有控制终端,这对于守护进程来说是一件好事。
再次 fork(),以便父级(会话组组长)可以退出。这意味着,作为非会话组组长,我们永远无法重新获得控制终端。
chdir("/") 以确保我们的进程不会保留任何正在使用的目录。如果不这样做,管理员就无法卸载文件系统,因为它是我们当前的目录。[同样,我们可以切换到任何包含对守护进程的操作很重要的文件的目录。]
umask(0),这样我们就可以完全控制我们写入的任何内容的权限。我们不知道我们可能继承了什么 umask。[此步骤是可选的]
close() fds 0、1 和 2。这将释放我们从父进程继承的标准输入、输出和错误。我们无法知道这些 fds 可能被重定向到哪里。请注意,许多守护进程使用 sysconf() 来确定限制 _SC_OPEN_MAX。_SC_OPEN_MAX 告诉您每个进程的最大打开文件数。然后在一个循环中,守护进程可以关闭所有可能的文件描述符。您必须决定是否需要这样做。如果您认为可能有文件描述符打开,则应该关闭它们,因为并发文件描述符的数量是有限制的。
为 stdin、stdout 和 stderr 建立新的打开描述符。即使您不打算使用它们,打开它们仍然是一个好主意。这些的精确处理取决于个人喜好;例如,如果您有一个日志文件,您可能希望将其作为 stdout 或 stderr 打开,并将“/dev/null”作为 stdin 打开;或者,您可以将“/dev/console”作为 stderr 和/或 stdout 打开,将“/dev/null”作为 stdin 打开,或者任何其他对您的特定守护进程有意义的组合。
更好的是,如果可用,只需调用daemon()函数。
解决方案 2:
我建议你根本不要把程序写成守护进程。让它在前台运行,并给它指定文件描述符、当前目录、进程组等。
如果您希望将此程序作为守护进程运行,请使用 start-stop-daemon(8)、init(8)、runsv(来自 runit)、upstart、systemd 或任何其他程序将您的进程作为守护进程启动。也就是说,让您的用户决定如何运行您的程序,而不是强制它必须作为守护进程运行。
解决方案 3:
只需使用daemon(3)
(来自unistd.h
)。
daemon() 函数适用于希望脱离控制终端并作为系统守护进程在后台运行的程序。...
解决方案 4:
第一种。第二种不是守护进程,而是在后台运行。守护进程应该有自己的会话和进程组,并且不应该有控制终端。
解决方案 5:
实际上,要创建守护进程,您必须进行双重分叉。
使用 & 运行该程序会使 shell 在后台运行该程序,但这并不会使它成为守护进程。守护进程以 init (pid 1) 作为父进程,因此需要双 fork。
因此,如果您的程序是守护进程,那么最好的办法就是自己处理这个问题(还有更多方法,请参见此处)。您也可以使用 start-stop-daemon 程序。
解决方案 6:
您使用的是哪种语言?有些语言有辅助方法,可使守护进程更容易。例如,Ruby 有守护进程包。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件