gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:16:56 28 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

一般来说,启动是通过 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 这给了我一个钩子(Hook)来启动我想要的任何东西(我让它运行我的 ~/.xinitrc它运行我的窗口管理器和所有东西),以及稍后击落所有东西的地方。缺乏将控制权交给用户的标准化使得找到 Hook 非常烦人,因为仅使用不同的登录管理器(例如 lightdm 与 gdb)可能会改变 Hook 的位置。

4) 一种完全不同的方法是让用户的 crontab 启动守护进程。运行“man 5 crontab”并寻找特殊的@reboot 选项以在启动时运行任务。我自己没有使用过它——它有可能是 root 限制的,但它很容易测试,你只需要考虑让你的守护进程在系统关闭时优雅地(快速地)存在,当系统向它发送 SIGTERM 信号时(见/etc/init.d/sendsigs 了解详情)。

希望能有所帮助。

关于c++ - 通过 C++ 代码在 Linux 上启动/停止守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21402657/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com