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


230

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

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

如何在Unix上完成相同的工作?echoingenvcmd仅显示当前时间的值,但是我想查看正在运行的进程当前正在使用的值。


2
即使/ proc / <pid> / environ的大小为0,那里仍然有信息。“如果将其视为进入内核的窗口,这会更有意义。该文件实际上并不包含任何数据;它只是充当指向实际过程信息所在位置的指针。” [source ]
nevets1219 2011年

Answers:


295
cat /proc/<pid>/environ

如果您想获取给定正在运行的可执行文件的pid,可以在许多其他可能性中使用pidof

AlberT$ pidof sshd   
30690 6512 

编辑

我完全引用了Dennis WilliamsonTeddy的评论,以实现更具可读性的输出。我的解决方案如下:

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

46
为了使其可读,请将空值转换为换行符:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson 2009年

32
我总是这么做xargs --null --max-args=1 echo < /proc/PID/environ
Teddy

7
最好使用字符串,其速度很快。猫还是更快:-)
Nikhil Mulley,2012年

2
整个/proc文件系统不可移植。
Daniel H

6
我不明白为什么使用xargsNULL转换为换行比使用更好tr。有人可以为我布置吗?谢谢。
乔纳森·哈特利

61

由于此问题具有unix标记,并且其他所有人在解决linux标记方面都做得非常出色,因此您可以使用以下方法在OS X和其他BSD派生的系统上获取此信息:

ps -p <PID> -wwwe

要么

ps -p <PID> -wwwE

在Solaris上

/usr/ucb/ps -wwwe <PID>

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


3
II 在OS X 10.6上运行ps -p <PID> -wwwe我得到所有正在运行的进程的列表。正确的命令带有-E标志,而不带有-e。
drAlberT

1
我在OS X 10.4(而非10.5)上进行了测试。相应地更新。
Gerald Combs

4
这不是完美的。-E选项仅报告初始环境变量。如果变量已被正在运行的进程本身更改(例如,通过使用POSIX putenv()函数),则更改不会反映在的输出中ps -p <PID> -wwE
2013年

1
看不到您不拥有的进程的env vars听起来像是一个不错的功能。@drAlberT使用的面向Linux的答案也是如此/proc/PID/environ。这些文件仅由进程的所有者读取。
乔纳森·哈特利

1
@yani可能,但是要困难得多,它需要将调试器附加到正在运行的进程。看到这个答案:unix.stackexchange.com/a/70636
卡尔

25

就像其他人提到的那样,在Linux上,您可以查看/ proc,但是根据您的内核版本,有一个或两个限制:

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

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

第一个外壳程序是登录外壳程序,最初具有非常有限的环境,但是通过采购.bashrc来扩展它,但是/ proc不能反映这一点。第二个shell从一开始就继承了较大的环境,这就是为什么它在/ proc中显示的原因。

另外,在较早的内核上,环境文件的内容限制为页面大小(4K):

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

在2.6.9(RHEL4)和2.6.18(RHEL5)之间的某个位置已删除此限制...


1
是否可以获取在远程过程生成后设置的远程过程的环境变量?我了解在VFS上,它会显示在/ proc / self / environ中,但前提是我们在进程内部。但是,如何获得一个远程进程呢?
GP92

11

正确使用BSD选项来执行此操作(至少在linux上):

ps e $pid

要么

ps auxe  #for all processes

是的,ps联机帮助页非常令人困惑。(通过


我的Ubuntu沿命令行向上破坏环境变量,它们之间的间距不大,并且在终端窗口上截断为一行。我发现ps eww $pid解决了第二个问题。
user18911 2013年

1
@ user18911:env var具有空字符分隔符。本页上的其他答案显示了使用方法xargstr将其转换为换行符以提高可读性的方法。您可能在接下来的四年中意识到了这一点。
乔纳森·哈特利

7
cat /proc/PID/environ

用您要查看的进程的PID替换PID。有关正在运行的进程的所有信息都在/ proc / PID /目录下

例如:cat / proc / 32512 / environ


7

摘自Archlinux Wiki

您可以创建一个临时函数来解析中的值/proc/<pid>/environ。在终端提示下:

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

然后使用所需的进程的pid,只需使用:

envof <pid>



5

尽管文档很少,但其中的内容/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

3

而且由于我的工作使我成为AIX的忠实粉丝,所以我们不要忘记:

ps eww [pid]

或如手册页所称的那样,为“伯克利标准”。

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


2

如果要env为任意进程(PID)创建类似于环境变量输出的格式,则可以创建一个方便的bash penv <pid>命令(针对您的OS)并将其添加到您的.bashrc

Linux将其添加到您的〜/ .bashrc中:

penv () { 
    xargs --null --max-args=1 < /proc/$1/environ
}

macOS / BSD将此添加到您的〜/ .bashrc中:

penv() {
   ps eww -o command $1  | tr ' ' '\n'
}

Solaris将它添加到您的〜/ .bashrc中:

penv() {
   pargs -e $1
}

用法:

$ source $ HOME / .bashrc
$ pgrep VBoxSVC
10268
$ Penv 10268
SSH_CONNECTION = 1.1.1.242 53960 1.1.1.91 22
GREP_COLORS = sl = 49; 39:cx = 49; 39:mt = 49; 38; 5; 167; 1:fn = 49; 39; 1:ln = 49; 39:bn = 49; 39:se = 50; 39
LANG = zh_CN.UTF-8
编辑器= vim
XDG_SESSION_ID = 106
USER =根
PWD = /根
HOME = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
邮件= / var / mail / root
TERM = xterm-256color
外壳= / bin / bash
SHLVL = 1
LOGNAME =根
DBUS_SESSION_BUS_ADDRESS = unix:path = /运行/用户/ 0 /总线
XDG_RUNTIME_DIR = /运行/用户/ 0
路径= / root / bin:/ bin:/ sbin:/ usr / bin:/ usr / sbin:/ usr / local / bin:/ usr / local / sbin :.
VBOX_LOG_FLAGS =线程tsc
VBOX_LOG =-全部+ dev_vmm_backdoor.elf + dev_vmm.elf

0

Mac解决方案,也许其他的BSD也可能是这样的

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

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

这不是完美的,因为它们是空间分隔的而不是LF分隔的


-1

/ proc / PID /环境

为此,首先我们需要确定过程的PID。为此,您可以使用ps命令

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.