【问题标题】:Start/Stop daemon on Linux via C++ code通过 C++ 代码在 Linux 上启动/停止守护进程
【发布时间】:2014-02-19 13:52:39
【问题描述】:

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

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

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

虽然已知第 2 种方法使用命令行启动服务,但第 3 种方法用于在用户登录时自动启动服务(或任何其他应用程序)。

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

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

【问题讨论】:

  • 你要求更好的方式;请告诉我们不同的方式在哪些方面可以更好。更便携?更快的执行?更短的代码?对特殊情况更健壮?其他方面?
  • 我不确定这是否是建议的方法。我是 Linux 编程新手,找不到任何关于以编程方式启动守护进程的建议方法的参考
  • 我从未听说过用户进程启动系统守护进程,除非它是系统配置工具或类似工具。所以我想通过exec() 调用启动/停止脚本是唯一的预期方式。
  • @Alfe:感谢您的建议。我想这回答了我的问题。您可以将其发布为答案,以便我标记它吗?
  • 我只是从未听说过,但我认为这不是一个合适的答案 ;-) 感谢您提出接受这一点,但我认为我们应该让您的问题保持开放(不接受和未回答),直到有人有更明确的说法。

标签: c++ linux daemon


【解决方案1】:

通常,启动是通过 shell 脚本完成的,这些脚本会调用您的 C++ 程序,然后执行其双叉。请注意,它还应该关闭不需要的文件描述符,使用 setsid() 和可能的 setpgid/setpgrp(我不记得这些是否也适用于 Linux),可能是 chdir("/") 等。有一些相当正常的史蒂文斯书中描述的要做的事情 - 有关更多信息,请参阅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 选项以使任务在启动时运行。我自己没有使用过它 - 有可能它是 root 限制的,但它很容易测试,你只需要考虑让你的守护进程在系统关闭时优雅地(并且快速地)存在,当系统向它发送 SIGTERM 信号时(参见 /etc/ init.d/sendsigs 了解详细信息)。

希望从中有所帮助。

【讨论】:

  • 该信息非常有帮助,但我正在寻找有关最佳/推荐方法的信息,该方法可以从已经运行的程序(最好使用其自己的 GUI)中执行此操作,如果可能的话,是有原因的一样的
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 2012-01-24
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多