我需要启动一个服务并(稍后)检测它是否从 C++ 程序中运行。有没有比使用合适的参数调用 systemctl 并解析输出更简单的方法?
服务的来源完全在我的控制之下。 (目前它是用 bash 编写的,但 C++ 包装器是完全可能的。)
(我简要了解了 DBus - 它显然非常强大,但未能通过“更简单”的测试。)
服务的来源完全在我的控制之下。 (目前是用 bash 编写的,但 C++ 完全可以。)
该代码适用于运行 Debian Jessie 变体的嵌入式设备。可移植性不是主要问题(但显然,如果它是可移植的,答案对其他人会更有用)。
最佳答案
大多数程序都是以另一种方式编写的(即使在 systemd 出现之前)。
典型的服务(那些拥有并以单个服务器进程启动的服务)在启动时将其 PID(作为单行的 ASCII 数字)写入某些 /var/run/foobar.pid
文件中。如果您在服务中采用这样的约定,则可以使用 fscanf
读取该文件,然后使用 kill(
pid, 0);
检查进程是否正在运行(当然,您不能确定它是同一个服务,但很可能是)。
我现在有超过 20 个与 /var/run/*.pid
匹配的文件,特别是 /var/run/sshd.pid
和 /var/run/atd.pid
因此,假设您可以改进服务 FooBar 的代码(如果该功能不存在),请更改其代码以将其 pid 写入 /var/run/foobar.pid
;这是有记录的convention .
如果您可以更改服务,您可能会让它提供一些ping或nop功能;因此您可以向其中添加一些 RPC 工具,该工具仅检查服务是否正在运行(并且还可以提供一些附加信息,例如程序的版本等)。大多数现有的Linux服务都具有这样的功能。
关于linux - 以编程方式启动 systemd 服务或测试服务是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35219605/