Linux 以编程方式启动systemd服务或测试服务是否正在运行 我需要启动一个服务,(稍后)检测它是否从C++程序运行。有没有比使用合适的参数调用systemctl并解析输出更简单的方法
服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++包装器是完全可能的) (我简要介绍了DBus——它显然非常强大,但没有通过“更简单”的测试。) 服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++完全是可能的)Linux 以编程方式启动systemd服务或测试服务是否正在运行 我需要启动一个服务,(稍后)检测它是否从C++程序运行。有没有比使用合适的参数调用systemctl并解析输出更简单的方法,linux,systemd,Linux,Systemd,服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++包装器是完全可能的) (我简要介绍了DBus——它显然非常强大,但没有通过“更简单”的测试。) 服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++完全是可能的) 该代码用于运行Debian Jessie变体的嵌入式设备。可移植性不是一个主要问题(但如果是可移植的,那么答案显然对其他人更有用)。大多数程序都是以另一种方式编写的(即使在系统化之前) 典型的服务(具有并以单服务器进程启动的服务)在启动时将其PID(作
该代码用于运行Debian Jessie变体的嵌入式设备。可移植性不是一个主要问题(但如果是可移植的,那么答案显然对其他人更有用)。大多数程序都是以另一种方式编写的(即使在系统化之前) 典型的服务(具有并以单服务器进程启动的服务)在启动时将其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
;这是一个记录在案的过程
如果您可以更改服务,您可能会让它提供一些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
不必担心更新程序,它只是运行并完成它的工作。为什么需要检测服务是否仍在运行?该服务何时以及为什么停止运行?你说的是什么样的服务?主程序本身就是一个可以自动更新的服务。显然,更新过程涉及重新启动主服务。通过将更新过程创建为一个单独的(一次性)服务,它位于一个单独的cgroup中,并且不会因为终止主服务而终止。当主服务启动并发现我们处于更新模式时,它想知道更新服务是否仍在运行或是否已崩溃。这仍然无法告诉我们您神秘的服务是什么。。。。你应该编辑你的问题,而不是评论它!在ttm.service
中,我想检测ttm.update.service
是否正在运行或是否已完成。ttm.update.service
的目的是,呃,更新ttm.service
:-)更清楚吗?为什么不让您的操作系统的服务管理器担心保持服务正常运行,然后用service
/status
或其他init.d脚本(例如cron)查询其状态?分离关注点和所有这些。无法解决“启动服务”部分(但调用systemctl很容易)。2.原则上我不喜欢PID文件。他们证明过程开始了,kill(
pid,0)代码>测试证明具有该PID的进程正在运行。。。但这并不能证明它是同一个进程(在我的Linux上只有32767个独特的PID)。OTOH,这可能是我能做的最好的了:-(