程序如何检测自己是否作为systemd守护进程运行?

7

在程序中是否有办法检测它正在作为systemd守护进程运行?

systemd API

sd_booted()

此命令用于检测整个系统是否由systemd引导启动,但并不涉及程序本身。

谢谢


2
检查它的 ppid(父进程ID)也许可以? - Mark Setchell
1
我认为检测这个并不是一个好主意。相反,我会采用一些程序参数约定(例如,如果您传递了--started-from-systemd,则假设它已由systemd启动,并配置您的systemd以传递该参数)。 - Basile Starynkevitch
/proc/<pid>/cgroupsystemd 条目似乎对由 systemd 运行的服务有所不同(我在我的树莓派上快速查看了一下)。 - code_onkel
3个回答

3

获取父进程 ID 并查看该进程是否为 systemd


2
从systemd v232开始,所有作为服务单元启动的进程都会获得一个环境变量INVOCATION_ID。这是systemd独有的好特性,所以它可以作为检测systemd的方便方法,但不一定可靠。
个人使用此功能禁用时间戳日志,因为systemd日志已经实现了该功能。

我刚刚在我的常规终端中运行了echo $INVOCATION_ID,并且看到了一个调用ID。看起来systemd已经在我的系统上启动了我的用户会话,所以这可能不一定有效。 - flaviut

1
你可以在守护程序的服务文件中设置一个神奇的环境变量,然后查找此变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接