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

관련 정보