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


231

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? echoingenvcmd 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.


2
Mặc dù / Proc / <pid> / môi trường có kích thước bằng 0, vẫn có thông tin trong đó. "Sẽ có ý nghĩa hơn nếu bạn nghĩ về nó như một cửa sổ vào kernel. Tệp không thực sự chứa bất kỳ dữ liệu nào; nó chỉ hoạt động như một con trỏ tới nơi chứa thông tin quy trình thực tế." [nguồn ]
nevets1219

Câu trả lời:


295
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 ý kiến ​​của Dennis WilliamsonTeddy để đạt được kết quả dễ đọc hơn. Giải pháp của tôi là như sau:

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

46
Để làm cho nó dễ đọc hơn, hãy chuyển đổi null thành dòng mới:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson

32
Tôi luôn luôn làmxargs --null --max-args=1 echo < /proc/PID/environ
Teddy

7
sử dụng chuỗi tốt hơn, nhanh. Mèo vẫn nhanh hơn :-)
Nikhil Mulley

3
Toàn bộ /prochệ thống tập tin không phải là di động.
Daniel H

6
Tôi không hiểu tại sao sử dụng xargsđể chuyển đổi null thành dòng mới tốt hơn sử dụng tr. Ai đó có thể đặt nó ra cho tôi? Cảm ơn.
Jonathan Hartley

61

Vì câu hỏi này có thẻ unix và mọi người khác đã thực hiện một công việc tuyệt vời như vậy đối với thẻ linux , bạn có thể nhận 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ợ /procthư mục nếu bạn không muốn nhớ thông tin tối nghĩa ps.


3
II chạy ps -p <PID> -wwwe trên OS X 10.6 Tôi nhận được danh sách tất cả các quy trình đang chạy. lệnh bên phải là với cờ -E , không phải -e.
drAlberT

1
Tôi đã thử nghiệm trên OS X 10.4, nhưng không phải 10.5. Cập nhật cho phù hợp.
Gerald Combs

4
Điều này là không hoàn hảo. Tùy chọn -E chỉ báo cáo các biến môi trường ban đầu . Nếu các biến đã được thay đổi bởi chính quá trình đang chạy (ví dụ: thông qua việc sử dụng hàm POSIX putenv ()), các thay đổi không được phản ánh trong đầu ra của ps -p <PID> -wwE.
Kal

1
Không thấy env vars của các quá trình không thuộc sở hữu của bạn nghe có vẻ như là một tính năng mong muốn. Đây cũng là trường hợp cho câu trả lời theo định hướng Linux của @ drAlberT /proc/PID/environ. Những tập tin chỉ có thể đọc được bởi chủ sở hữu của quá trình.
Jonathan Hartley

1
@yani Có thể, nhưng khó hơn nhiều, nó đòi hỏi phải gắn trình gỡ lỗi vào quy trình đang chạy. Xem câu trả lời này: unix.stackexchange.com/a/70636
Kal

25

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à quy 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 được 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 ...


1
Có thể lấy các biến môi trường của một quy trình từ xa được thiết lập sau khi quy trình được sinh ra? Tôi hiểu rằng trên VFS, nó được hiển thị với / Proc / self / môi trường nhưng chỉ khi chúng tôi ở trong quy trình. Nhưng làm thế nào để có được điều này cho một quá trình từ xa?
GP92

11

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 )


Ubuntu của tôi đập các biến môi trường ngay trên dòng lệnh, thậm chí không có nhiều khoảng trống giữa chúng và cũng cắt ngắn thành một dòng trên cửa sổ terminal. Tôi tìm thấy ps eww $pidsửa chữa vấn đề thứ 2.
user18911

1
@ user18911: Các vv env có dấu phân cách ký tự null. Các câu trả lời khác trên trang này cho thấy các cách sử dụng xargshoặc trchuyển đổi chúng thành dòng mới để dễ đọc. Bạn có thể nhận ra điều này trong bốn năm qua.
Jonathan Hartley

7
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

Lấy từ wiki Archlinux :

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 dấu nhắc thiết bị đầu cuối:

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>

6

Trong Linux, tôi sẽ thử xem

/proc/<pid>/environ


5

Mặc dù tài liệu khá thưa thớt, nội dung của /proc/<pid>/environsẽ 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

3

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.


2

Nếu bạn muốn tạo định dạng envnhư đầ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 penv <pid>lệnh bash thuận tiện (đượ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 video này vào bạn ~ / .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:

$ nguồn $ 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
NGƯỜI DÙNG = root
NKT = / root
TRANG CHỦ = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / pts / 3
MAIL = / var / mail / root
HẠN = xterm-256 màu
CHIA SẺ = / bin / bash
SHLVL = 1
ĐĂNG NHẬP = root
DBUS_SESSION_BUS_ADDRESS = unix: path = / run / user / 0 / bus
XDG_RUNTIME_DIR = / run / người dùng / 0
PATH = / root / bin: / bin: / sbin: / usr / bin: / usr / sbin: / usr / local / bin: / usr / local / sbin :.
VBOX_LOG_FLAGS = chủ đề tsc
VBOX_LOG = -all + dev_vmm_backdoor.elf + dev_vmm.elf

0

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


-1

/ Proc / PID / môi trường

Đối với điều này, trước tiên chúng ta cần xác định PID của quá trình. Đối với điều này, bạn có thể sử dụng lệnh ps

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.