Variabel lingkungan dari proses yang berjalan di Unix?

231

Saya perlu memecahkan beberapa masalah yang terkait dengan variabel lingkungan pada sistem Unix.

Pada Windows, saya dapat menggunakan alat seperti ProcessExplorer untuk memilih proses tertentu dan melihat nilai dari masing-masing variabel lingkungan.

Bagaimana saya bisa melakukan hal yang sama di Unix? echoingdan envcmd hanya menunjukkan nilai pada saat ini, tetapi saya ingin melihat nilai apa yang sedang berjalan saat ini.

m3rLinEz
sumber
2
Meskipun / proc / <pid> /viron memiliki ukuran 0, masih ada informasi di sana. "Lebih masuk akal jika Anda menganggapnya sebagai jendela ke dalam kernel. File tersebut tidak benar-benar berisi data apa pun; ia hanya bertindak sebagai penunjuk ke tempat informasi proses aktual berada." [sumber ]
nevets1219

Jawaban:

295
cat /proc/<pid>/environ

Jika Anda ingin memiliki pid (s) dari executable berjalan yang diberikan Anda dapat, di antara sejumlah kemungkinan lain, gunakan pidof:

AlberT$ pidof sshd   
30690 6512 

EDIT :

Saya benar-benar mengutip komentar Dennis Williamson dan Teddy untuk mencapai hasil yang lebih mudah dibaca. Solusi saya adalah sebagai berikut:

tr '\0' '\n' < /proc/<pid>/environ
drAlberT
sumber
46
Untuk membuatnya dapat dibaca, konversikan nulls ke baris baru:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson
32
Saya selalu melakukannyaxargs --null --max-args=1 echo < /proc/PID/environ
Teddy
7
lebih baik gunakan string, lebih cepat. Kucing masih lebih cepat :-)
Nikhil Mulley
3
Seluruh /procsistem file tidak portabel.
Daniel H
6
Saya tidak mengerti mengapa menggunakan xargsuntuk mengonversi nulls ke baris baru lebih baik daripada menggunakan tr. Bisakah seseorang menjelaskannya untuk saya? Terima kasih.
Jonathan Hartley
61

Karena pertanyaan ini memiliki tag unix dan semua orang telah melakukan pekerjaan yang sangat baik menangani tag linux , Anda bisa mendapatkan informasi ini pada OS X dan sistem turunan BSD lainnya menggunakan

ps -p <PID> -wwwe

atau

ps -p <PID> -wwwE

dan di Solaris dengan

/usr/ucb/ps -wwwe <PID>

Solaris juga mendukung /procdirektori jika Anda tidak ingin mengingat perintah yang tidak jelas ps.

Gerald Combs
sumber
3
Saya menjalankan ps -p <PID> -wwwe di OS X 10.6 Saya mendapatkan daftar semua proses yang berjalan. perintah yang benar adalah dengan flag -E , bukan -e.
drAlberT
1
Saya diuji pada OS X 10.4, tetapi tidak 10.5. Diperbarui sesuai.
Gerald Combs
4
Ini tidak sempurna. Opsi -E hanya melaporkan variabel lingkungan awal . Jika variabel telah diubah oleh proses yang berjalan itu sendiri (misalnya melalui penggunaan fungsi POSIX putenv ()), perubahan tidak tercermin dalam output dari ps -p <PID> -wwE.
Kal
1
Tidak melihat beberapa proses yang tidak Anda miliki terdengar seperti fitur yang diinginkan. Ini juga merupakan kasus untuk jawaban berorientasi Linux @ drAlberT menggunakan /proc/PID/environ. File-file itu hanya dapat dibaca oleh pemilik proses.
Jonathan Hartley
1
@yani Mungkin saja, tetapi jauh lebih sulit, ini membutuhkan melampirkan debugger ke proses yang sedang berjalan. Lihat jawaban ini: unix.stackexchange.com/a/70636
Kal
25

Seperti yang disebutkan orang lain, di Linux, Anda dapat mencari di / proc tetapi ada, tergantung pada versi kernel Anda, satu atau dua batasan:

Pertama-tama, file environment berisi lingkungan seperti yang terlihat ketika proses itu muncul. Itu berarti bahwa setiap perubahan proses yang mungkin telah dilakukan terhadap lingkungannya tidak akan terlihat di / proc:

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

Shell pertama adalah shell login dan awalnya memiliki lingkungan yang sangat terbatas tetapi tumbuh dengan sumber misalnya .bashrc tetapi / proc tidak mencerminkan hal ini. Shell kedua mewarisi lingkungan yang lebih besar dari awal, itulah sebabnya ia tampil di / proc.

Juga, pada kernel yang lebih tua, isi file environment dibatasi hingga ukuran halaman (4K):

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

Di suatu tempat antara 2.6.9 (RHEL4) dan 2.6.18 (RHEL5) batas ini telah dihapus ...

Lasse
sumber
1
Apakah mungkin untuk mendapatkan variabel lingkungan dari proses jarak jauh yang ditetapkan setelah proses melahirkan? Saya mengerti bahwa pada VFS, ditunjukkan dengan / proc / self / environment tetapi hanya jika kita berada di dalam proses. Tetapi bagaimana cara mendapatkan ini untuk proses jarak jauh?
GP92
11

perbaiki penggunaan opsi BSD untuk melakukan ini (setidaknya di linux):

ps e $pid

atau

ps auxe  #for all processes

dan ya, halaman ps cukup membingungkan. ( via )

remah-remah
sumber
Ubuntu saya menghancurkan variabel lingkungan tepat terhadap baris perintah, bahkan tanpa banyak ruang di antara mereka, dan juga memotong satu baris di jendela terminal. Saya menemukan ps eww $pidperbaikan masalah ke-2.
user18911
1
@ user18911: env vars memiliki pemisah karakter nol. Jawaban lain pada halaman ini menunjukkan cara untuk menggunakan xargsatau trmengonversinya ke baris baru agar mudah dibaca. Anda mungkin menyadari hal ini dalam empat tahun terakhir.
Jonathan Hartley
7
cat /proc/PID/environ

ganti PID dengan PID dari proses yang ingin Anda lihat. Setiap informasi tentang proses yang berjalan berada di bawah direktori / proc / PID /

contoh: cat / proc / 32512 /viron

kargig
sumber
7

Diambil dari wiki Archlinux :

Anda dapat membuat fungsi sementara untuk menguraikan nilai-nilai di /proc/<pid>/environ. Di terminal prompt:

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

Kemudian dengan pid dari proses yang Anda inginkan, cukup gunakan:

envof <pid>
mwotton
sumber
6

Di Linux, saya akan mencoba melihat

/proc/<pid>/environ
Joril
sumber
5

Untuk Solaris 5.10, ini berfungsi:

pargs -e <PID>
Mykola Novik
sumber
5

Meskipun agak jarang didokumentasikan, konten /proc/<pid>/environhanya akan berisi lingkungan yang digunakan untuk memulai proses.

Jika Anda perlu memeriksa keadaan lingkungan proses saat ini, salah satu cara untuk melakukannya adalah dengan menggunakan 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
Michael Renner
sumber
3

Dan karena pekerjaan saya membuat saya menjadi penggemar boy AIX, janganlah kita lupa:

ps eww [pid]

Atau seperti halaman manual menyebutnya, "Standar Berkeley".

Untuk alasan apa pun, / proc / PID / environment tidak ada di AIX.

Corey S.
sumber
2

Jika Anda ingin membuat envoutput seperti variabel lingkungan yang diformat untuk proses arbitrer (PID), Anda dapat membuat penv <pid>perintah bash yang nyaman (disesuaikan dengan OS Anda) dan menambahkannya ke .bashrc:

Linux menambahkan ini ke ~ / .bashrc Anda:

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

macOS / BSD menambahkan ini ke ~ / .bashrc Anda:

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

Solaris menambahkan ini ke ~ / .bashrc Anda:

penv() {
   pargs -e $1
}

Pemakaian:

$ 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
JANGKA = xterm-256 warna
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 = utas tsc
VBOX_LOG = -semua + dev_vmm_backdoor.elf + dev_vmm.elf
cahaya terang
sumber
0

Solusi mac, mungkin BSD lain juga bisa seperti itu

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

Variabel lingkungan ditambahkan ke baris perintah, ini menghapus baris perintah dan kami hanya memiliki variabel lingkungan yang tersisa.

Itu tidak sempurna karena mereka dipisahkan oleh ruang, bukan jika LF dipisahkan

Erik Martino
sumber
-1

/ proc / PID / environment

untuk ini, pertama-tama kita perlu mengidentifikasi PID dari proses. untuk ini, Anda dapat menggunakan perintah ps

varun
sumber