我想检查 Linux 进程如何填充和继承环境变量。它可能对那些没有显式 shell 作为父进程的进程特别有用(具有 exec 启动类型的 Docker 容器等)
以有条理和富有表现力的形式获得该列表将是完美的,例如 pstree
使用可选的额外信息绘制进程列表。
不幸的是我还没有找到pstree
的方法列出树中所有进程的环境变量。有一个 -a
选项,但看起来只有当环境变量以命令行参数的形式传递时它才有帮助(情况并非总是如此)
当然可以通过例如获取单个过程变量使用 pstree -p
获取 PID然后使用 cat /proc/<PID>/environ
提取环境数据然而这并不是我想要的。
最佳答案
这不能以可移植方式完成。哎呀,我什至不知道有什么方法可以做到不可移植。环境变量存储在进程的地址空间中。在 Linux 上,/proc/$pid/environ 仅显示进程启动时存在的变量。它没有显示该过程可能使用 putenv()
或 setenv()
或该过程使用的语言编写的任何机制对环境变量进行的任何后续修改。将其放入名为 env_test 的文件中:
#!/bin/sh
export WTF=hello
export PATH=XXXXXXXXXXXXXXX
./env_test2 &
/usr/bin/sleep 999
将其放入名为 env_test2 的文件中:
#!/bin/sh
export WTF=goodbye
export PATH=ZZZZZZZZZZZZZZZZZZZZ
/usr/bin/sleep 999
现在输入 ./env_test &
然后 ps waux | grep env_test
获取两个脚本的 pids。检查相应的 /proc/$pid/environ 伪文件并注意 env_test 所做的更改被 env_test2 继承并反射(reflect)在它神奇的 /proc/$pid/environ 文件,但每个脚本完成的 export
并未反射(reflect)在该内容中。
关于linux - 如何以系统和分层的方式列出所有进程的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57442088/