Linux 守护进程

2024-10-17 08:47:00
admin
原创
66
摘要:问题描述:我正在编写一个 Linux 守护进程。我发现了两种方法来实现它。fork()通过调用和设置来守护您的进程sid。使用 运行你的程序&。哪种方法才是正确的?解决方案 1:摘自http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16以...

问题描述:

我正在编写一个 Linux 守护进程。我发现了两种方法来实现它。

  1. fork()通过调用和设置来守护您的进程sid

  2. 使用 运行你的程序&

哪种方法才是正确的?


解决方案 1:

摘自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()函数。

解决方案 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 有守护进程包。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用