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



我需要启动一个服务,然后(稍后(检测它是否从C++程序中运行。 有没有比使用合适的参数调用 systemctl 并解析输出更简单的方法?

服务的来源完全在我的控制之下。 (目前它是用 bash 编写的,但 C++ 包装器是完全可能的。

(我已经简要介绍了 DBus - 它显然非常强大,但未能通过"更简单"的测试。

服务的来源完全在我的控制之下。 (目前它是用bash写的,但C++是完全可能的。

该代码适用于运行 Debian Jessie 变体的嵌入式设备。 可移植性不是一个主要问题(但显然,如果它是可移植的,答案对其他人会更有用(。

大多数程序都是以另一种方式编写的(即使在系统化之前的日子里(。

典型的服务(那些具有启动单个服务器进程的服务(在启动时将其 PID(作为单行上的 ASCII 数字(写入某个/var/run/foobar.pid文件中。如果在服务中采用此类约定,则可以使用 fscanf 读取该文件,然后检查进程是否以 pid , 0); kill(运行(当然,您无法确定它是相同的服务,但可能是(。

我现在有超过20个文件与/var/run/*.pid匹配,特别是/var/run/sshd.pid/var/run/atd.pid

因此,假设您可以改进服务FooBar的代码(如果该功能不存在(,请更改其代码以将其pid写入/var/run/foobar.pid;这是一个记录在案的约定。

如果你可以更改服务,你可能会让它提供一些pingnop功能;所以你会添加一些RPC工具,它只是检查服务是否正在运行(也可以提供一些额外的信息,如程序的版本等(。大多数现有的Linux服务都有这样的功能。

为什么不把问题转过来呢? 不需要解析。

ttm.update.service将执行以下操作。

systemctl stop ttm.service
systemctl disable ttm.service
#do you update here
#if the service configs changed do
systemctl daemon-reload
systemctl enable ttm.service
systemctl start ttm.service

ttm.service永远不必担心updater,它只是运行并完成它的工作。

最新更新