取得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(大寫)作為最近足夠的系統) 將僅提供值:

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

如果不在自己的腳本中,可以在可執行行之前使用前綴:以避免任何解析系統

字首 影響
“:” 如果可執行路徑以「:」為前綴,則不套用環境變數替換(如下面的「命令列」部分所述)。

從而在服務文件中保持相同:

ExecStart=:/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

相關內容