Answers:
cat /proc/<pid>/environ
如果您想获取给定正在运行的可执行文件的pid,可以在许多其他可能性中使用pidof
:
AlberT$ pidof sshd
30690 6512
编辑:
我完全引用了Dennis Williamson和Teddy的评论,以实现更具可读性的输出。我的解决方案如下:
tr '\0' '\n' < /proc/<pid>/environ
cat /proc/17330/environ | tr \\0 \\n
xargs --null --max-args=1 echo < /proc/PID/environ
/proc
文件系统不可移植。
xargs
NULL转换为换行比使用更好tr
。有人可以为我布置吗?谢谢。
由于此问题具有unix标记,并且其他所有人在解决linux标记方面都做得非常出色,因此您可以使用以下方法在OS X和其他BSD派生的系统上获取此信息:
ps -p <PID> -wwwe
要么
ps -p <PID> -wwwE
在Solaris上
/usr/ucb/ps -wwwe <PID>
/proc
如果您不想记住晦涩的命令,Solaris也支持该目录ps
。
ps -p <PID> -wwE
。
/proc/PID/environ
。这些文件仅由进程的所有者读取。
就像其他人提到的那样,在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)之间的某个位置已删除此限制...
ps eww $pid
解决了第二个问题。
xargs
或tr
将其转换为换行符以提高可读性的方法。您可能在接下来的四年中意识到了这一点。
您可以创建一个临时函数来解析中的值/proc/<pid>/environ
。在终端提示下:
envof() { sed 's/\x0/\n/g' /proc/${1}/environ; }
然后使用所需的进程的pid,只需使用:
envof <pid>
对于Solaris 5.10,这有效:
pargs -e <PID>
尽管文档很少,但其中的内容/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
如果要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
Mac解决方案,也许其他的BSD也可能是这样的
pid=28369; ps e $pid | cut -c$(expr 1 + $(ps p $pid|tail +2|wc -c))-
环境变量被附加到命令行,这将删除命令行,而我们只剩下环境变量了。
这不是完美的,因为它们是空间分隔的而不是LF分隔的