从一个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