我需要排除Unix系统中与环境variables有关的一些问题。
在Windows上,我可以使用ProcessExplorer等工具来select特定的进程并查看每个环境variables的值。
我怎样才能在Unix上完成同样的事情? echoing
和env
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