我需要启动一个服务,并(稍后)检测它是否从C++程序中运行。有没有比使用合适的参数调用systemctl并解析输出更简单的方法?
服务的源代码完全在我的控制之下。(目前它是用bash编写的,但完全可以使用C++包装器。)
(我简要地看了一下DBus --它显然非常强大,但没有通过“更简单”的测试。)
服务的源代码完全在我的控制之下。(目前它是用bash编写的,但C++是完全可能的。)
该代码适用于运行Debian Jessie变体的嵌入式设备。可移植性并不是一个主要的问题(但显然,如果它是可移植的,那么答案对其他人来说会更有用)。
发布于 2016-02-05 16:42:48
大多数程序都是以另一种方式编写的(即使在前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服务都有这样的功能。
发布于 2018-04-28 08:48:05
为什么不把问题颠倒过来呢?不需要解析。
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.servicettm.service不必担心updater,它只需运行并完成它的工作即可。
https://stackoverflow.com/questions/35219605
复制相似问题