it-swarm.cn

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

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

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

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

235
m3rLinEz
cat /proc/<pid>/environ

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

AlberT$ pidof sshd   
30690 6512 

[〜#〜]编辑[〜#〜]

我完全引用 Dennis WilliamsonTeddy 注释来获得更可读的输出。我的解决方案如下:

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

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

ps -p <PID> -wwwe

要么

ps -p <PID> -wwwE

在Solaris上

/usr/ucb/ps -wwwe <PID>

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

63
Gerald Combs

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

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

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

第一个Shell是登录Shell,最初具有非常有限的环境,但通过采购例如.bashrc,但/ proc无法反映这一点。第二个Shell从一开始就继承了较大的环境,因此它在/ proc中显示。

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

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

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

25
Lasse

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

ps e $pid

要么

ps auxe  #for all processes

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

11
raincrumb

尽管记录很少,但/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
7
Michael Renner
cat /proc/PID/environ

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

例如:cat/proc/32512/environ

7
kargig

取自 Archlinux Wiki

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

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

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

envof <pid>
7
mwotton

对于Solaris 5.10,这有效:

pargs -e <PID>
6
Mykola Novik

在Linux下,我会尝试看看

/proc/<pid>/environ
6
Joril

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

ps eww [pid]

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

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

4
Corey S.

如果要为任意进程(PID)创建格式化的env类似环境变量的输出,则可以创建一个方便的bash penv <pid>命令(适合您的操作系统)并将其添加到您的.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 = en_US.UTF-8 
 EDITOR = vim 
 XDG_SESSION_ID = 106 
 USER = root 
 PWD =/root 
 HOME =/root 
 SSH_CLIENT = 1.1.1.242 53960 22 
 SSH_TTY =/dev/pts/3 
 MAIL =/var/mail/root 
 TERM = xterm-256color 
 Shell =/bin/bash 
 SHLVL = 1 
 LOGNAME = root 
 DBUS_SESSION_BUS_ADDRESS = unix:path =/run/user/0 /总线
 XDG_RUNTIME_DIR =/run/user/0 
 PATH =/root/bin:/ bin:/ sbin:/ usr/bin:/ usr/sbin:/ usr/local/bin :/ usr/local/sbin:。
 VBOX_LOG_FLAGS =线程tsc 
 VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf 
3
clearlight

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

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

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

这是不完美的,因为它们之间没有空格分隔LF

0
Erik Martino