Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 以编程方式启动systemd服务或测试服务是否正在运行 我需要启动一个服务,(稍后)检测它是否从C++程序运行。有没有比使用合适的参数调用systemctl并解析输出更简单的方法_Linux_Systemd - Fatal编程技术网

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

Linux 以编程方式启动systemd服务或测试服务是否正在运行 我需要启动一个服务,(稍后)检测它是否从C++程序运行。有没有比使用合适的参数调用systemctl并解析输出更简单的方法,linux,systemd,Linux,Systemd,服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++包装器是完全可能的) (我简要介绍了DBus——它显然非常强大,但没有通过“更简单”的测试。) 服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++完全是可能的) 该代码用于运行Debian Jessie变体的嵌入式设备。可移植性不是一个主要问题(但如果是可移植的,那么答案显然对其他人更有用)。大多数程序都是以另一种方式编写的(即使在系统化之前) 典型的服务(具有并以单服务器进程启动的服务)在启动时将其PID(作

服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++包装器是完全可能的) (我简要介绍了DBus——它显然非常强大,但没有通过“更简单”的测试。)

服务的来源完全在我的控制之下。(目前它是用BASH编写的,但是C++完全是可能的)
该代码用于运行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,这可能是我能做的最好的了:-(