在Linux上通过C++代码启动/停止守护进程

3

我正在尝试找到一种方法来从我的程序中启动一个自定义守护进程。该守护进程本身是使用双重分叉机制实现的,如果直接启动,则可以正常工作。

到目前为止,我已经了解到了各种启动守护进程的方法:

  1. 创建一个init脚本并将其安装到init.d目录中。
  2. 使用start-stop-daemon命令启动程序。
  3. 创建.desktop文件并将其放置在其中一个自动启动路径中。

前两种方法已知可以使用命令行启动服务,而第三种方法是用于在用户登录时自动启动服务(或任何其他应用程序)。

到目前为止,我猜测可以使用exec()函数族直接执行程序,或者可以通过system()函数执行'start-stop-daemon'命令。

是否有更好的方法来启动/停止服务呢?


2
你正在寻求更好的方法;请告诉我们在哪些方面不同的方法可能会更好。更具可移植性?执行更快?代码更短?更能应对特殊情况?其他方面? - Alfe
1
我从未听说过用户进程启动系统守护进程,除非它是系统配置工具或类似工具。因此,我猜想只有通过 exec() 调用启动/停止脚本才是预期的方法。 - Alfe
谢谢!@ArunMu。守护进程遵循了您建议的过程。 - skaur
1
@Alfe:感谢您的建议。我想这回答了我的问题。您能否将其发布为答案,以便我可以标记它? - skaur
1
我从未听说过这个,但我认为这不是一个合适的答案;-) 谢谢您提供接受它的机会,但我认为我们应该保持您的问题开放(未被接受和回答),直到有人有更明确的话要说。 - Alfe
显示剩余2条评论
1个回答

0

通常,启动脚本会调用您的C++程序,然后执行其双重fork。请注意,它还应该关闭不需要的文件描述符,使用setsid()和可能的setpgid/setpgrp(我不记得这些是否也适用于Linux),可能是chdir("/")等。有许多相当正常的事情要做,这些在Stevens书中有所描述-有关更多信息,请参见http://software.clapper.org/daemonize/daemonize.html

如果守护进程应该以root或其他系统用户帐户运行,则系统/etc/init/或/etc/init.d/机制是适当的位置,可以在其中编写脚本来停止|启动|状态|等您的守护进程。

如果守护进程应该为用户,并在其帐户下运行,则有几个选项。

1).desktop文件-我个人不是粉丝,但如果它在注销时还为您执行某些操作(例如让您触发关闭守护进程),则可能是可行的。

2) 对于控制台登录,您可以通过守护程序的包装器支持运行命令来启动和关闭 ~/.bash_login 和 ~/.bash_logout。后者可以通过将 PID 保存在文件中或让 .bash_login 将其保存在变量中以供稍后使用 .bash_logout。这可能需要进行一些调整,以确保两个脚本仅由最外层登录 shell 运行一次(正常的 .bashrc 内容保留在 .bashrc 中,.bash_login 需要在启动守护程序之前为登录 shell 读取它,以便 PATH 等已设置)。

3) 对于图形环境,您需要找到包装器脚本,例如 X 窗口管理器所运行的脚本。我正在使用 lightdm,某个时刻 /etc/X11/Xsession.d/40x11-common_xsessionrc 最终会运行我的 ~/.xsessionrc,这为我提供了一个钩子来启动任何我想要的东西(我让它运行我的 ~/.xinitrc,它运行我的窗口管理器和所有其他内容),以及关闭所有东西的地方。给用户控制的缺乏标准化使得查找钩子非常烦人,因为仅使用不同的登录管理器(例如 lightdm 与 gdb)就可以更改钩子的位置。

4)一个完全不同的方法是只让用户的crontab启动守护进程。运行“man 5 crontab”,查找特殊的@reboot选项,使任务在启动时运行。我自己没有使用过它 - 存在根限制的可能性,但很容易测试,并且您只需要考虑在系统发送SIGTERM信号(有关详细信息,请参见/etc/init.d/sendsigs)时优雅地(和迅速地)停止您的守护程序。

希望其中某些内容能够帮助到您。


这些信息非常有用,但我正在寻找关于从一个已经运行的程序中以最佳/推荐的方式(最好具备自己的GUI)执行它的信息,如果可能的话,请给出理由。 - skaur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接