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


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

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

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


200
2017-09-17 18:14




即使/ proc / <pid> / environ的大小为0,仍然存在信息。 “如果你把它看作是进入内核的窗口,那就更有意义。文件实际上并不包含任何数据;它只是作为指向实际进程信息所在位置的指针。” [资源] - nevets1219


答案:


cat /proc/<pid>/environ

如果您想拥有给定运行可执行文件的pid,您可以使用其他许多可能性 pidof

AlberT$ pidof sshd   
30690 6512 

编辑

我完全引用@Teddy注释来获得更可读的输出:

xargs --null --max-args=1 < /proc/<pid>/environ

257
2017-09-17 18:18



要使其可读,请将空值转换为换行符: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
我经常做 xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
更好地使用字符串,速度快。猫仍然更快:-) - Nikhil Mulley
整体 /proc filesystem不可移植。 - Daniel H
我不明白为什么用 xargs将空值转换为换行符比使用更好 tr。有人能为我安排好吗?谢谢。 - Jonathan Hartley


既然这个问题有一个 UNIX 标签和其他人都做了如此出色的工作 Linux的 tag,您可以使用OS X和其他BSD派生系统获取此信息

ps -p <PID> -wwwe

要么

ps -p <PID> -wwwE

在Solaris上

/usr/ucb/ps -wwwe <PID>

Solaris也支持 /proc 目录,如果你不想记住晦涩难懂 ps 条命令。


52
2017-09-17 20:47



我跑了 ps -p <PID> -wwwe 在OS X 10.6上,我获得了所有正在运行的进程的列表。正确的命令是 -E 国旗,而不是-e。 - drAlberT
我在OS X 10.4上测试过,但不测试10.5。相应更新。 - Gerald Combs
这并不完美。 -E选项仅报告 初始 环境变量。如果变量已被运行进程本身更改(例如通过使用POSIX putenv()函数),则更改不会反映在输出中 ps -p <PID> -wwE。 - Kal
没有看到不属于你的流程的env vars听起来像是一个理想的功能。 @ drAlberT的面向Linux的答案也是如此 /proc/PID/environ。这些文件只能由进程所有者读取。 - Jonathan Hartley
@yani这是可能的,但它更难,它需要将调试器附加到正在运行的进程。看到这个答案: unix.stackexchange.com/a/70636 - Kal


正如其他人所提到的,在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)之间,此限制已被删除......


24
2017-10-29 11:27



是否有可能获得在生成该过程后设置的远程过程的环境变量?我理解在VFS上,它显示在/ proc / self / environ中,但前提是我们在进程内部。但是如何为远程进程获取此信息呢? - Jeevan Patnaik


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

ps e $pid

要么

ps auxe  #for all processes

是的,ps manpage非常令人困惑。 (通过


10
2018-03-04 12:15



我的Ubuntu直接打破了命令行的环境变量,甚至没有它们之间的空间,也截断到终端窗口上的一行。我发现 ps eww $pid 解决了第二个问题。 - user18911
@ user18911:env vars有一个空字符分隔符。此页面上的其他答案显示了使用方法 xargs 要么 tr 将这些转换为换行符以便于阅读。你可能在这四年间意识到这一点。 - Jonathan Hartley


cat /proc/PID/environ

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

示例:cat / proc / 32512 / environ


7
2017-09-17 18:19





在Linux下,我试着看看

/proc/<pid>/environ

6
2017-09-17 18:19





取自 Archlinux维基

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

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

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

envof <pid>

6
2018-01-13 23:05





对于Solaris 5.10,这适用于:

pargs -e <PID>

4
2017-08-08 10:04