gdbusユーティリティを使用して一時システムデバイスから終了コードを取得する方法

gdbusユーティリティを使用して一時システムデバイスから終了コードを取得する方法

からドッカーコンテナ過渡システムユニット内部にホスト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

関連情報