如何显示 systemd 单元的环境变量?

如何显示 systemd 单元的环境变量?

env我正在尝试从 systemd 服务单元转储systemctl show-environment没有做我想做的事。有什么方法可以向systemctl我展示我的服务内部的环境是什么样的?

答案1

如果您的服务正在运行,您可以使用systemctl status <name>.service来识别服务进程的 PID,然后使用sudo strings /proc/<PID>/environ来查看进程的实际环境。

答案2

运行一个在其中执行“set”的脚本并将输出写入文件。

#!/usr/bin/ksh

set >> /tmp/set-results.txt

答案3

详细说明 @telcoM 的答案,您可以使用此单行代码从当前运行的单 PID 服务转储环境变量(通过一些调整,您可以迭代所有 PID 并连接结果):

strings /proc/$(systemctl status <unitname>.service | grep -Po '(?<=PID: )\d+')/environ

如果相关服务无法启动或无法访问,systemctl可以使用一个命令来查看磁盘上用于配置该服务的所有文件的组合。从手册页:

cat PATTERN...
           Show backing files of one or more units. Prints the "fragment" and
           "drop-ins" (source files) of units. Each file is preceded by a comment
           which includes the file name. Note that this shows the contents of the
           backing files on disk, which may not match the system manager's
           understanding of these units if any unit files were updated on disk and
           the daemon-reload command wasn't issued since.

因此systemctl cat <unitname>.service应该生成显示计算的配置“文件”的输出。请注意,除了上面关于磁盘上更新的文件的警告之外,如果您有指令,EnvironmentFile您可能需要寻找该文件以获得完整的情况。像这样的东西可能会让你相当接近,但输入起来却很困难:

echo $(systemctl show-environment) $(systemctl cat <unitname>.service | grep -Po '(?<=^Environment=)[^\n]*') $(cat "$(systemctl cat <unitname>.service | grep -Po '(?<=^EnvironmentFile=-)[^\n]*')")

我们正在做的事情如下:

  • systemctl show-environment-- 获取systemctl的当前环境
  • systemctl cat <unitname>.service | grep -Po '(?<=^Environment=)[^\n]*'-- 获取相关单位的环境指令
  • cat "$(systemctl cat <unitname>.service | grep -Po '(?<=^EnvironmentFile=-)[^\n]*')"-- 获取列出的文件的内容。如果它们没有以破折号为前缀,您可能需要稍微调整 grep 模式
  • echo ...-- 将上面的所有输出混合成一个字符串。肯定有更漂亮的方法来做到这一点。

相关内容