linux - 如何以系统和分层的方式列出所有进程的环境变量

标签 linux docker process environment-variables

我想检查 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/

相关文章:

linux - debian:mysql-workbench 安装错误 [找不到-lpython2.7.a]

java - Ubuntu Java : Find a specific program's pid and kill the program

docker - 由 Docker 复制的文件被视为目录

node.js - 如果容器处于 CrashLoopBackOff 状态,如何执行到容器并查看文件

python - 设置一个python进程名称

java processbuilder 打开一个文本文件读取数据

linux - hrtimer 即使未启动也会运行

java - 如何在Java中制作echo 1 >/sys/class/gpio/gpio18/value

docker - docker ps -a是什么意思

.net - 为什么我的控制台应用程序在使用 Process.Start() 启动时没有图标?