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

我需要排除Unix系统中与环境variables有关的一些问题。

在Windows上,我可以使用ProcessExplorer等工具来select特定的进程并查看每个环境variables的值。

我怎样才能在Unix上完成同样的事情? echoingenv cmd只显示当前值,但我想查看当前运行的进程正在使用什么值。

 cat /proc/<pid>/environ 

如果你想有一个给定的正在运行的可执行文件,你可以使用pidof

 AlberT$ pidof sshd 30690 6512 

编辑

我完全引用@Teddy评论来实现更可读的输出:

 xargs --null --max-args=1 < /proc/self/environ 

由于这个问题有一个unix标签,其他人都做了这么好的工作来解决linux标签,你可以在OS X和其他BSD派生系统上使用这个信息

 ps -p <PID> -wwwe 

要么

 ps -p <PID> -wwwE 

并在Solaris上

 /usr/ucb/ps -wwwe <PID> 

正如其他人所说的,在Linux上,你可以看看/ proc,但是根据你的内核版本,有一个或两个限制:

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

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

第一个shell是一个loginshell,最初有一个非常有限的环境,但通过采购例如.bashrc增长,但/ proc不反映这一点。 第二个shell从一开始就inheritance了更大的环境,这就是它在/ proc中显示的原因。

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

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

介于2.6.9(RHEL4)和2.6.18(RHEL5)之间的此限制已被删除…

正确使用BSD选项来做到这一点(至less在linux上):

 ps e $pid 

要么

 ps auxe #for all processes 

是的,PS的manpage是相当混乱。 ( 通过 )

 cat /proc/PID/environ 

将PIDreplace为您要查看的进程的PID。 有关正在运行的进程的每个信息都位于/ proc / PID /目录下

例如:cat / proc / 32512 / environ

在Linux下,我试着看看

 /proc/<pid>/environ 

采取从Archlinux维基 :

您可以创build一个临时函数来parsing/proc/<pid>/environ 。 在terminal提示符下:

 envof() { sed 's/\x0/\n/g' /proc/${1}/environ; } 

然后用你想要的进程的pid,只需使用:

 envof <pid> 

对于Solaris 5.10,这可以工作:

 pargs -e <PID> 

而且由于我的工作让我成为AIX粉丝男孩,让我们不要忘记:

 ps eww [pid] 

或者如手册页所述,“伯克利标准”。

无论出于何种原因,/ proc / PID / environ在AIX中都不存在。

Mac解决scheme,可能其他BSD也可能是类似的

 pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))- 

环境variables被附加到命令行,这将删除命令行,我们只剩下环境variables。

这是不完美的,因为他们是空间分离而不是LF分离

虽然相当稀less地logging,但/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