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

Start/Stop daemon on Linux via C++ code

本文关键字:守护程序 启动 代码 Linux 通过      更新时间:2023-10-16

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

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

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

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

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

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

通常是从shell脚本完成的启动,这些启动会调用您的C 程序,然后将其执行双分叉。请注意,它还应该关闭不需要的文件描述符,使用setSID()和可能的setPGID/setPgrp(我不记得这些也适用于Linux),可能是Chdir("/")等。史蒂文斯书中描述的事情 - 有关更多信息,请参见http://software.clapper.org/daemonize/daemonize.html

如果守护程序应该使用root或其他系统用户帐户运行,则系统/etc/init/or/et/or/et/or/et/or/et.d/机制是适当的地方,可以停止脚本|开始|开始| status | status |等守护程序。

如果戴蒙应该适合用户,并且在其帐户下运行,则有几个选择。

1).desktop文件 - 我个人不是粉丝,但是如果它在登录时也可以为您做些事情(例如,让您触发关闭守护程序),它可能是可行的。

2)对于控制台登录,〜/.bash_login和〜/.bash_logout-您可以使用守护程序的包装器支持这些运行命令来启动它,然后(稍后)将其关闭。可以通过将PID保存到文件中或使.bash_login将其保存在.bash_logout将稍后使用的变量中来完成。这可能涉及一些调整,以确保仅通过最外面的登录外壳来确保两个脚本都能运行(normal .bashrc stupt停留在.bashrc中,并且.bash_login需要在登录shell 中读取它。启动守护程序之前,因此路径等将设置为)。

3)对于图形环境,您需要找到包装脚本,从中运行X Window Manager之类的内容。我正在使用lightDM,在某个点/etc/x11/xsession.d/40x11-common_xsessionrc最终运行了我的〜/.xsessionrc,这给了我一个启动的钩子(我让我运行我的〜/.xinitrc,这是我的窗户经理和所有内容),以及以后将所有内容击落的地方。缺乏为用户提供控制的标准化使查找挂钩非常烦人,因为仅使用其他登录管理器(例如LightDM与GDB)可以改变挂钩所在的位置。

4)一种完全不同的方法是使用户的crontab启动守护程序。运行" Man 5 crontab",并寻找特殊的@reboot选项,以使启动时运行任务。我没有自己使用过 - 有可能会受到根的限制,但是它易于测试,您只需要考虑使守护程序在系统发送时在系统关闭处优雅地存在(并迅速),该系统将其发送给Sigterm信号(请参阅/etc/etc/init.d/sendsigs以获取详细信息)。

希望有帮助。