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

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

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

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

  • 在UNIX中,硬对于软装有什么优点/缺点?
  • 如何检查mysql上运行的是什么端口
  • 疯狂的想法:确定系统是否空闲,当它是一个黑匣子
  • Unix主机文件顺序
  • Unix UID有多大(以位为单位)?
  • 我怎么快捷,而不是键入“python”?
  • 11 Solutions collect form web for “Unix上正在运行的进程的环境variables?”

     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 
    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.