Systemd 插件无法创建 PID 文件

Systemd 插件无法创建 PID 文件

我在路径上有一个 systemd-machined 插件/etc/systemd/system/systemd-machined.service.d/10-machined-pid-file.conf。当我运行时,systemctl status systemd-machined我确实看到了以下几行

Drop-In: /etc/systemd/system/systemd-machined.service.d
       └─10-machined-pid-file.conf

但是,我在 /var/run/ 中没有看到 PID 文件。根据我的插入:

[Serivce]
PIDFile=/var/run/machined.pid

我相信创建该 PID 文件应该不会有任何问题。我是否遗漏了什么?

答案1

设置PIDFile=创造PID 文件。这仍然由服务本身决定,就像过去 40 年一样。相反,此选项告诉 systemd 在哪里找到现有的 PID 文件(如果有)。在大多数情况下,它根本不需要,因为 systemd 会将服务保留在自己的 cgroup 中,并且不需要 PID 文件来跟踪它们。但是,systemd 将删除如果服务退出后无法自行清理,则返回 PID 文件。

来自文档

采用指向此守护进程的 PID 文件的绝对文件名。建议对Type=设置为 的服务使用此选项forking。systemd 将在服务启动后读取守护进程主进程的 PID。systemd 不会写入此处配置的文件,但如果文件仍然存在,它会在服务关闭后将其删除。

答案2

遗憾的是,即使您在服务的单元文件中指定一行,systemd 也不会为非分叉服务创建 PID 文件PIDFile=。但您可以使用一行来作弊ExecStartPost=,例如:

ExecStartPost=/bin/sh -c 'umask 022; pgrep YOURSERVICE > /var/run/YOURSERVICE.pid'

答案3

我认为如果你想要获得主进程的 PID,使用“grep” pid 文件是错误的方法

systemctl show -p MainPID --value SERVICE

(其中服务是单位名称)

使用示例:

ExecStartPost=/bin/bash -c '/bin/systemctl show -p MainPID --value unbound > /run/unbound.pid'

*ps ensure cmd paths (distro vary)

 which systemctl 

 which bash 

相关内容