Systemd의 ExecStart 지시문 및 해결된 환경 변수 표시

Systemd의 ExecStart 지시문 및 해결된 환경 변수 표시

ExecStart특정 시스템 서비스에서 사용되는 전체 지침을 추출하는 방법이 있는지 궁금합니다 . "전체"는 ExecStart다음을 수행할 때 표시되는 리터럴 버전이 아니라 문자열의 해석된 버전을 나타냅니다 .

systemctl show kubelet.service -p ExecStart

예:

$ cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

[Service]
...
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/opt/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

일반적인 systemctl show <svc>지침은 "리터럴" 문자열을 표시합니다...

$ systemctl show kubelet.service -p ExecStart --no-pager | cut -d";" -f2 | sed 's@argv\[\]=@@' | sed 's@^ @@'
/opt/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

하지만 환경 변수의 내용이 올바르게 표시되도록 위의 해석된 버전을 찾고 있습니다.

EnvironmentFile저는 이 상태가 ( 위 절에서 선언된 대로) 이러한 변수가 위치한 환경 파일의 존재를 이미 인식하고 있어야 한다고 믿기 때문에 systemd 엔진 어딘가에서 이 상태를 사용할 수 있기를 바랍니다 .

물론 서비스 파일을 구문 분석하고 이 모든 정보를 얻는 스크립트를 작성할 수 있지만 더 쉬운 방법이 있을 것으로 예상/희망합니다.

답변1

/proc프로세스의 환경을 보기 위해 쿼리할 수 있습니다 .

# MainPID=$(systemctl show -p MainPID docker.service | cut -d '=' -f 2)
# cat "/proc/$MainPID/environ" | tr '\0' '\n'
LANG=C.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NOTIFY_SOCKET=/run/systemd/notify
LISTEN_PID=1230
LISTEN_FDS=1
LISTEN_FDNAMES=docker.socket
INVOCATION_ID=4f91e56391f742b2aefa4252b6760f42
JOURNAL_STREAM=9:36808

관련 정보