我在路径上有一个 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