可安装的 Linux 守护进程,如何在 C++ 中创建它们?
我有一个 C++ 中的服务器应用程序,我希望它的行为方式与 Windows 服务相同。即它应该在系统启动时启动,而与是否有用户登录无关。在 Windows 中,有许多 C++ 类能够促进与服务管理器的通信并处理启动/停止/暂停命令。 Linux 呢?另外如何轻松部署我的应用程序?我羡慕使用 apt-get 系统命令安装某些应用程序的方式,使用自定义应用程序很容易做到吗,比如说我在一台机器上提供二进制文件,然后自动从目标 Linux 中获取它们……?
预先感谢您的帮助。
原文由 charfeddine.ahmed 发布,翻译遵循 CC BY-SA 4.0 许可协议
好的,首先,您需要知道在 Windows 和 Linux 中编写服务是非常不同的。首先,在 Linux 中,“服务”不称为“服务”,它们被称为“守护进程”。知道了这一点,你可以用 google 找到这个非常有用的文档。
至于启动/停止/重启,这里没有通用的预制解决方案。在大多数情况下,守护进程在 /var/run 中创建 *.pid 文件;这些文件包含它们的进程标识符“PID”。然后编写一个简单的 bash 脚本,通过从适当的文件中读取 pid 并向其发送终止信号来控制守护程序的执行。
例如,假设您的守护进程名称是
foo
。然后它将创建文件 /var/run/foo.pid 并将其 PID 写入其中,使用 ASCII 字符并在末尾附加一个换行符。您的控制脚本名称将是fooctl
,它应该支持以下命令:启动、停止和重新启动。也就是说,当您运行fooctl start
时,脚本应该首先检查相应的 pid 文件是否存在,如果不存在,则执行任何必要的操作来启动守护进程;当您运行fooctl stop
时,它应该从 /var/run/foo.pid 读取 pid 并终止具有该 ID 的进程。在fooctl restart
的情况下,您的脚本需要先停止守护程序,然后重新启动它。话虽如此,这只是关于守护进程应该如何工作的协议。这就是通常的做法。但这些规则并没有以任何方式执行。您可以自由地发明和使用自己的技术来创建和控制守护进程。
至于您问题的第二部分(关于 apt-get),这称为包管理。它与守护进程无关,但既然您问:要使用您的自定义应用程序,您需要将它发布到主存储库中,这可能由于多种原因是不可能的;或者您可以创建自己的仓库。您还可以为您的应用程序组装一个 *.deb 包,它同样易于安装。在 Web 上搜索有关如何为自定义 Linux 应用程序构建包的更多信息。