显示 Systemd 的 ExecStart 指令以及已解析的环境变量

显示 Systemd 的 ExecStart 指令以及已解析的环境变量

想知道是否有办法提取ExecStart任何给定 systemd 服务所使用的完整指令。请注意,“完整”是指字符串的解释版本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

但我正在寻找上述内容的解释版本,以便正确显示环境变量的内容。

我希望这个状态可以在 systemd 引擎的某个地方使用,因为我相信这个状态必须已经知道这些变量所在的环境文件的存在(如上面在EnvironmentFile子句中声明的那样)。

当然,我可以编写一个脚本来解析服务文件并获取所有这些信息,但我怀疑/希望有一种更简单的方法。

答案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

相关内容