Unix 上正在运行的进程的环境变量?

Unix 上正在运行的进程的环境变量?

我需要解决一些与 Unix 系统上的环境变量相关的问题。

在 Windows 上,我可以使用 ProcessExplorer 之类的工具来选择特定的进程并查看每个环境变量的值。

我如何在 Unix 上完成同样的事情?echoing并且envcmd 只显示当前时间的值,但我想查看正在运行的进程当前正在使用什么值。

答案1

cat /proc/<pid>/environ

如果你想要获取正在运行的可执行文件的进程号,除了其他几种可能的方法外,你还可以使用pidof

AlberT$ pidof sshd   
30690 6512 

编辑

我完全引用丹尼斯·威廉森泰迪熊注释以实现更易读的输出。我的解决方案如下:

tr '\0' '\n' < /proc/<pid>/environ

答案2

由于这个问题有一个unix标签和其他人都做了如此出色的工作来解决Linux的标签,你可以在 OS X 和其他 BSD 衍生系统上使用以下方式获取此信息

ps -p <PID> -wwwe

或者

ps -p <PID> -wwwE

在 Solaris 上

/usr/ucb/ps -wwwe <PID>

/proc如果您不想记住晦涩的命令, Solaris 还支持目录ps

答案3

正如其他人提到的,在 Linux 上,您可以查看 /proc,但根据您的内核版本,存在一或两个限制:

首先,environ 文件包含进程生成时的环境。这意味着进程对其环境所做的任何更改在 /proc 中都是不可见的:

$ cat /proc/$$/environ | wc -c
320
$ bash
$ cat /proc/$$/environ | wc -c
1270
$ 

第一个 shell 是登录 shell,最初具有非常有限的环境,但可以通过获取 .bashrc 等资源来扩展环境,但 /proc 不会反映这一点。第二个 shell 从一开始就继承了更大的环境,这就是它在 /proc 中显示的原因。

此外,在较旧的内核中,environ 文件的内容限制为页面大小(4K):

$ cat /proc/$$/environ | wc -c
4096
$ env | wc -c
10343
$ 

在 2.6.9(RHEL4)和 2.6.18(RHEL5)之间,这个限制被取消了……

答案4

尽管记录相当稀少,但其内容/proc/<pid>/environ只包含用于启动该过程的环境。

如果您需要检查进程环境的当前状态,一种方法是使用gdb

# Start gdb by attaching it to a pid or core file
gdb <executable-file> <pid or core file>

# Run the following script to dump the environment
set variable $foo = (char **) environ
set $i = 0
while ($foo[$i] != 0)
print $foo[$i++]
end

相关内容