2016-02-05 69 views
-3

我需要启动服务并(稍后)检测它是否在C++程序中运行。有没有比调用具有合适参数的systemctl和解析输出更简单的方法?以编程方式启动systemd服务或测试运行的服务

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

(我在的DBus有过一次短暂的样子 - 这显然是很强大,但失败了“简单”的测试。)

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

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

+0

为什么你需要检测服务是否仍在运行?何时以及为何该服务停止运行?你在说什么确切的服务? –

+0

主程序本身就是一个可以自动更新的服务。显然,更新过程涉及重新启动主服务。通过将更新过程作为单独的(一次性)服务创建,它位于单独的cgroup中,并且不会因杀死主要服务而中止。当主服务启动并发现我们处于UPDATE模式时,它想知道更新服务是否仍在运行或者是否已崩溃。 –

+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

如果您可以更改服务,您可能会提供一些pingnop功能;所以你可以添加一些RPC工具来检查服务是否正在运行(并且还可以提供一些附加信息,如程序的版本等)。大多数现有的Linux服务都具有此功能。

+1

1.不解决“启动服务”部分(但为此调用systemctl非常简单)。 2.我原则上不喜欢PID文件。他们证明这个过程开始了,'kill('pid',0);'测试证明了一个具有该PID的进程正在运行......但它并不证明它是*相同的进程(并且只有我的Linux上有32767个独特的PID)。 OTOH,这可能是我能做的最好的事情:-( –

相关问题