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

时间:2014-01-28 10:13:52

标签: c++ linux daemon

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

到目前为止,我遇到了各种启动守护程序的方法:

  1. 创建一个init脚本并将其安装到init.d目录。
  2. 使用start-stop-daemon命令启动程序。
  3. 创建.desktop文件并放置在其中一个自动启动路径中。
  4. 虽然已知前两种方法使用命令行启动服务,但第三种方法是在用户登录时自动启动服务(或任何其他应用程序)。

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

    有没有更好的方法来启动/停止服务?

1 个答案:

答案 0 :(得分:0)

一般来说,启动是从shell脚本完成的,这些脚本会调用你的C ++程序然后执行它的双叉。请注意,它还应该关闭不需要的文件描述符,使用setsid()和可能的setpgid / setpgrp(我不记得这些是否适用于Linux),可能是chdir(" /")等史蒂文斯的书中描述了许多相当正常的事情 - 有关更多信息,请参阅http://software.clapper.org/daemonize/daemonize.html

如果守护进程应该以root或其他系统用户帐户运行,那么系统/ etc / init /或/etc/init.d/机制是让脚本停止|开始|状态|等等的适当位置守护进程。

如果deamon应该是针对用户的,并且在他/她的帐户下运行,那么您有几个选择。

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)。

希望有所帮助。