からドッカーコンテナ私過渡システムユニット内部にホストLinuxオペレーティングシステムスクリプトを実行します。スクリプトは成功時に終了0を返し、失敗すると終了1を返します。次のスクリプトは一時要素を生成します。
job_name=$(transient-unit-`date +%s%N`.service)
cmd="~/my_script_that_runs_on_the_host.sh"
gdbus call \
--system \
--dest=org.freedesktop.systemd1 \
--object-path /org/freedesktop/systemd1 \
--method org.freedesktop.systemd1.Manager.StartTransientUnit \
${job_name} fail "[('ExecStart', <[('/bin/sh', ['/bin/sh','-c', ${cmd}], false)]>)]" "[]" || true
エラーが発生した場合に修正アクションを実行できるように、一時デバイスからスクリプトの終了ステータスを取得する正しいgdbus構文を見つけようとしています。
答え1
ExecStart = の "main"プロセスの終了状態は、そのユニットがまだガベージコレクションとアンロードされていない限り、ロードされたユニットを表すオブジェクトのインタフェースのプロパティExecMainStatus
として使用できます。org.freedesktop.systemd1.Service
最初のステップは、Manager.GetUnit(name)
次を呼び出してデバイスのオブジェクトパスを取得することです。
# gdbus call -y -d org.freedesktop.systemd1 \
-o /org/freedesktop/systemd1 \
-m org.freedesktop.systemd1.Manager.GetUnit \
"foo.service"
(objectpath '/org/freedesktop/systemd1/unit/foo_2eservice',)
インターフェイスでメソッドを呼び出してプロパティにアクセスしますorg.freedesktop.DBus.Properties
。
# gdbus call -y -d org.freedesktop.systemd1 \
-o /org/freedesktop/systemd1/unit/foo_2eservice \
-m org.freedesktop.DBus.Properties.Get \
"org.freedesktop.systemd1.Service" \
"ExecMainStatus"
(<2>,)
gdbus introspect
(「busctl introspect」でもプロパティを見ることができます。)
systemdがある場合は、busctl get-property
シェルスクリプトで使用するのに適したラッパーと構文を持つBusctlもあります(つまり、署名を事前に指定する必要がありますが、各辞書値を別々の引数として渡すことができます。)引用gdbusを使用すると発生する可能性がある問題):
# busctl call org.freedesktop.systemd1 \
/org/freedesktop/systemd1 \
org.freedesktop.systemd1.Manager \
GetUnit s "foo.service"
o "/org/freedesktop/systemd1/unit/foo_2eservice"
# busctl call org.freedesktop.systemd1 \
/org/freedesktop/systemd1/unit/foo_2eservice \
org.freedesktop.DBus.Properties \
Get ss "org.freedesktop.systemd1.Service" "ExecMainStatus"
v i 2
# busctl get-property org.freedesktop.systemd1 \
/org/freedesktop/systemd1/unit/foo_2eservice \
org.freedesktop.systemd1.Service \
ExecMainStatus
i 2