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

时间:2016-02-05 08:36:37

标签: linux systemd

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

服务的来源完全由我控制。 (目前它是用bash编写的,但完全可以使用C ++包装器。)

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

服务的来源完全由我控制。 (目前它是用bash编写的,但C ++完全有可能。)

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

2 个答案:

答案 0 :(得分:0)

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

典型的服务(具有单个服务器进程并以单个服务器进程启动的服务)正在其启动时在某个/var/run/foobar.pid文件中写入其PID(作为一行上的ASCII编号)。如果您在服务中采用此类约定,则可以使用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服务都有这样的功能。

答案 1 :(得分:0)

为什么不解决问题呢?不需要解析。

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,它只是运行并完成它的工作。