我想编写一个 systemd 单元文件,该文件需要将其依赖项之一的 PID 传递给 exec 命令。在单元文件中,我希望包含以下内容:
ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service
有没有办法以某种简单的方式获取所需依赖项的 PID?在手册中找不到任何内容,在 Ubuntu 桌面上的任何单元文件中也找不到示例。
用例是创建一个简单的单元文件,该文件可用于将 JProfiler 守护程序附加到基于 Java 的服务,以便进行远程性能调试。附加分析器的命令需要 JVM 的 PID。
答案1
-p
,--property=
显示单位/工作/经理属性时展示命令,将显示限制为参数中指定的属性。参数应该是逗号分隔的属性名称列表,例如 ”
MainPID
”。 [...]
因此systemctl show -p MainPID foo
将显示MainPID=<pid>
(而不仅仅是 pid)。使用附加--value
(或组合参数-P
(大写))来获取足够近的systemd)将仅提供以下值:
--value
使用 show 打印属性时,仅打印值,并跳过属性名称和“=”。另请参阅上面的选项 -P。
在版本 230 中添加。
因此如果服务富可以通过它的主 PID 来识别(即:目标进程实际上不是主 pid 的子进程),可以使用以下方法:
/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'
如果脚本本身没有的话,可以在可执行行之前使用前缀:
,以避免任何解析systemd:
字首 影响 ... ... “:” 如果可执行路径以“:”为前缀,则不应用环境变量替换(如下方“命令行”部分所述)。 ... ...
从而在服务文件中保持相同:
ExecStart=:/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'