systemd で依存関係の PID を取得しますか?

systemd で依存関係の PID を取得しますか?

依存関係の 1 つである PID を exec コマンドに渡す必要がある systemd ユニット ファイルを作成したいと思います。ユニット ファイルには次の内容を含めます。

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"。 [...]

(pidだけではなく)systemctl show -p MainPID fooが表示されます。追加の(または組み合わせパラメータ(大文字)を使用して、十分に最近のMainPID=<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'

関連情報