
依存関係の 1 つである PID を exec コマンドに渡す必要がある systemd ユニット ファイルを作成したいと思います。ユニット ファイルには次の内容を含めます。
ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service
必要な依存関係の PID を簡単に取得する方法はありますか? Ubuntu デスクトップ上のマニュアルやユニット ファイルの例には何も見つかりませんでした。
使用例としては、リモート パフォーマンス デバッグを実行するために、JProfiler デーモンを Java ベースのサービスに接続するために使用できる単純なユニット ファイルを作成します。プロファイラーを接続するコマンドには、JVM の PID が必要です。
答え1
-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'