我需要启动一个服务,然后(稍后(检测它是否从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
;这是一个记录在案的约定。
如果你可以更改服务,你可能会让它提供一些ping或nop功能;所以你会添加一些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
,它只是运行并完成它的工作。