通过C 代码在Linux上启动/停止守护程序
Start/Stop daemon on Linux via C++ code
我正在尝试找到一种从程序中启动自定义守护程序的方法。守护程序本身是使用双装饰机制实现的,如果直接启动,则可以正常工作。
到目前为止,我已经遇到了各种启动守护程序的方法:
- 创建一个初始脚本并将其安装到init.d目录。
- 使用start-stop-daemon命令启动程序。
- 创建.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以获取详细信息)。
希望有帮助。
- QSerialPort 在应用程序启动之前正在使用中
- C++ - 从 MFC 应用程序启动记事本,并将其默认标题从 "Untitled - Notepad" 更改为其他内容
- 在应用程序启动时停靠 QDockWidget?
- 在应用程序启动时读取文件
- 如何从 c++ 程序启动 zsh/sh/bash 检查信号 SIGTTIN for 命令"cat &"
- osX - 如何从我的 QT 应用程序启动另一个程序
- 如何跟踪 C++14 中的控制台应用程序启动的次数?
- 我是一个大的C 菜鸟,我需要帮助我的程序启动代码块
- 调试从 Linux 中的另一个C++应用程序启动的 python 脚本
- QT 创建器:程序启动时音量滑块仍播放音频
- 从守护程序启动的控制台应用捕获输出
- 使用 gdb 调试 linux 守护程序的初始启动
- 添加新对话框后,MFC 应用程序启动失败并"DLL Initialization Failed"
- 在程序启动时选择不同的QMainWindow,但面临奇怪的QMessageBox exec()行为
- 在应用程序启动之前做某事
- 系统会冻结如果我使用运行的守护程序重新启动或关闭,该守护程序可以使用Fanotify控制对文件的访问
- 通过C 代码在Linux上启动/停止守护程序
- 启动-停止守护进程启动的C程序无法捕获信号
- 当将应用程序作为启动的守护程序运行时,C++ 库中的信号 10 (SIGBUS)
- 由于从客户端启动守护程序应用程序,服务器端口无法返回侦听并处于关闭等待状态