it-swarm-vi.tech

Biến môi trường của một tiến trình đang chạy trên Unix?

Tôi cần khắc phục một số vấn đề liên quan đến các biến môi trường trên hệ thống Unix.

Trên Windows, tôi có thể sử dụng một công cụ như ProcessExplorer để chọn một quy trình cụ thể và xem các giá trị của từng biến môi trường.

Làm thế nào tôi có thể hoàn thành điều tương tự trên Unix? echoingenv cmd chỉ hiển thị các giá trị ở thời điểm hiện tại, nhưng tôi muốn xem những giá trị nào mà quá trình đang chạy hiện đang sử dụng.

235
m3rLinEz
cat /proc/<pid>/environ

Nếu bạn muốn có pid (s) của một chương trình thực thi đang chạy, bạn có thể, trong số một số khả năng khác, hãy sử dụng pidof:

AlberT$ pidof sshd   
30690 6512 

[~ # ~] chỉnh sửa [~ # ~]:

Tôi hoàn toàn trích dẫn Dennis WilliamsonTeddy ý kiến ​​để đạt được đầu ra dễ đọc hơn. Giải pháp của tôi là như sau:

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

Vì câu hỏi này có thẻ nix và mọi người khác đã thực hiện một địa chỉ công việc tuyệt vời như vậy linux, bạn có thể lấy thông tin này trên OS X và các hệ thống có nguồn gốc BSD khác bằng cách sử dụng

ps -p <PID> -wwwe

hoặc là

ps -p <PID> -wwwE

và trên Solaris với

/usr/ucb/ps -wwwe <PID>

Solaris cũng hỗ trợ /proc thư mục nếu bạn không muốn nhớ tối nghĩa ps commmand.

63
Gerald Combs

Như những người khác đã đề cập, trên Linux, bạn có thể tìm trong/Proc nhưng tùy thuộc vào phiên bản kernel của bạn, một hoặc hai giới hạn:

Trước hết, tệp môi trường chứa môi trường như nó nhìn khi quá trình được sinh ra. Điều đó có nghĩa là mọi thay đổi mà quá trình có thể đã thực hiện đối với môi trường của nó sẽ không hiển thị trong/Proc:

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

Shell đầu tiên là Shell đăng nhập và ban đầu có môi trường rất hạn chế nhưng phát triển nó bằng cách tìm nguồn cung ứng, ví dụ: .bashrc nhưng/Proc không phản ánh điều này. Shell thứ hai thừa hưởng môi trường lớn hơn từ đầu, đó là lý do tại sao nó hiển thị trong/Proc.

Ngoài ra, trên các nhân cũ hơn, nội dung của tệp môi trường bị giới hạn ở kích thước trang (4K):

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

Ở đâu đó giữa 2.6.9 (RHEL4) và 2.6.18 (RHEL5) giới hạn này đã bị xóa ...

25
Lasse

sử dụng đúng các tùy chọn BSD để làm điều này (ít nhất là trên linux):

ps e $pid

hoặc là

ps auxe  #for all processes

và vâng, trang man ps khá khó hiểu. ( thông qua )

11
raincrumb

Trong khi tài liệu khá thưa thớt, nội dung của /proc/<pid>/environ sẽ chỉ chứa môi trường đã được sử dụng để bắt đầu quá trình.

Nếu bạn cần kiểm tra trạng thái hiện tại của môi trường của một quá trình, một cách để làm điều đó là sử dụng 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

thay thế PID bằng PID của quá trình bạn muốn xem. Mọi thông tin về một quy trình đang chạy đều nằm trong thư mục/Proc/PID /

ví dụ: cat/Proc/32512/môi trường

7
kargig

Lấy từ Archlinux wiki :

Bạn có thể tạo một hàm tạm thời để phân tích các giá trị trong /proc/<pid>/environ. Tại thiết bị đầu cuối Nhắc:

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

Sau đó, với quy trình bạn muốn, chỉ cần sử dụng:

envof <pid>
7
mwotton

Đối với Solaris 5.10, công việc này:

pargs -e <PID>
6
Mykola Novik

Trong Linux, tôi sẽ thử xem

/proc/<pid>/environ
6
Joril

Và vì công việc của tôi khiến tôi trở thành một fan boy AIX, chúng ta đừng quên:

ps eww [pid]

Hoặc như trang người đàn ông gọi nó, "Tiêu chuẩn Berkeley".

Vì bất kỳ lý do gì,/Proc/PID/môi trường không tồn tại trong AIX.

4
Corey S.

Nếu bạn muốn tạo định dạng env giống như đầu ra của các biến môi trường cho một quy trình tùy ý (PID), bạn có thể tạo một bash thuận tiện penv <pid> lệnh (được điều chỉnh cho hệ điều hành của bạn) và thêm nó vào .bashrc:

Linux thêm phần này vào ~/.bashrc:

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

macOS/BSD thêm phần này vào ~/.bashrc:

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

Solaris thêm phần này vào ~/.bashrc:

penv() {
   pargs -e $1
}

Sử dụng:

[.__.] $ source $ HOME/.bashrc [.__.] $ pgrep VBoxSVC [.__.] 10268 [.__.] $ penv 10268 [.__.] SSH_CONNMENT = 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/bus [.__.] XDG_RUNTIME_DIR =/run/user/0 [.__.] PATH =/root/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin :/usr/local/sbin :. [.__.] VBOX_LOG_FLAGS = thread tsc [.__.] VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf [.__.]
3
clearlight

Một giải pháp mac, có lẽ các BSD khác cũng có thể giống như

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

Các biến môi trường được gắn vào dòng lệnh, điều này loại bỏ dòng lệnh và chúng ta chỉ còn lại các biến môi trường.

Nó không hoàn hảo bởi vì chúng được phân tách không gian không LF được phân tách

0
Erik Martino