获取 systemd 中依赖项的 PID?

获取 systemd 中依赖项的 PID?

我想编写一个 systemd 单元文件,该文件需要将其依赖项之一的 PID 传递给 exec 命令。在单元文件中,我希望包含以下内容:

ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service

有没有办法以某种简单的方式获取所需依赖项的 PID?在手册中找不到任何内容,在 Ubuntu 桌面上的任何单元文件中也找不到示例。

用例是创建一个简单的单元文件,该文件可用于将 JProfiler 守护程序附加到基于 Java 的服务,以便进行远程性能调试。附加分析器的命令需要 JVM 的 PID。

答案1

man systemctl

-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'

相关内容