에서도커 컨테이너나는과도 시스템 유닛내부에호스트 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