如何使用 gdbus 实用程序从瞬态 systemd 单元检索退出代码

如何使用 gdbus 实用程序从瞬态 systemd 单元检索退出代码

从一个Docker容器我能够创建一个瞬态系统单元在里面主机Linux操作系统运行脚本。成功时脚本返回 exit 0,失败时返回 exit 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= 中“主”进程的退出状态可用作表示已加载单元的对象的接口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,它有一个busctl get-property包装器和更适合在shell脚本中使用的语法(即你需要预先指定签名,但你可以将每个字典值作为单独的参数传递——避免与引用相关的使用 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

相关内容