linux - 以编程方式启动 systemd 服务或测试服务是否正在运行

标签 linux systemd

我需要启动一个服务并(稍后)检测它是否从 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 .

如果您可以更改服务,您可能会让它提供一些pingnop功能;因此您可以向其中添加一些 RPC 工具,该工具仅检查服务是否正在运行(并且还可以提供一些附加信息,例如程序的版本等)。大多数现有的Linux服务都具有这样的功能。

关于linux - 以编程方式启动 systemd 服务或测试服务是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35219605/

相关文章:

linux - xsp4 服务 SystemD 服务退出并显示 "Start request repeated too quickly."

linux - 在 Linux 中将 Matlab 脚本作为批处理作业运行

linux - 替换每次出现的字符,除非它在模式中

Systemd 单元,使用外部脚本检查状态

MySQL 5.6 默认存储引擎是 MyISAM 而不是 InnoDB

docker - RedHat UBI 8 安装期望包

从 systemd 服务运行的 docker 启动但立即退出并重新启动,但是从 shell 运行的 docker 运行正常

regex - 使用 linux grep 查找电子邮件

linux - Oracle表单运行表单小程序但没有响应

java - linux shell 和 java