我需要解决一些与 Unix 系统上的环境变量相关的问题。
在 Windows 上,我可以使用 ProcessExplorer 之类的工具来选择特定的进程并查看每个环境变量的值。
我如何在 Unix 上完成同样的事情?echoing
并且env
cmd 只显示当前时间的值,但我想查看正在运行的进程当前正在使用什么值。
答案1
答案2
由于这个问题有一个unix标签和其他人都做了如此出色的工作来解决Linux的标签,你可以在 OS X 和其他 BSD 衍生系统上使用以下方式获取此信息
ps -p <PID> -wwwe
或者
ps -p <PID> -wwwE
在 Solaris 上
/usr/ucb/ps -wwwe <PID>
/proc
如果您不想记住晦涩的命令, Solaris 还支持目录ps
。
答案3
正如其他人提到的,在 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)之间,这个限制被取消了……
答案4
尽管记录相当稀少,但其内容/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