Pertanyaan Variabel lingkungan dari proses yang berjalan di Unix?


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

Di Windows, saya bisa menggunakan alat seperti ProcessExplorer untuk memilih proses tertentu dan melihat nilai dari setiap variabel lingkungan.

Bagaimana saya bisa mencapai hal yang sama di Unix? echoing dan env cmd hanya menunjukkan nilai saat ini, tetapi saya ingin melihat nilai apa yang sedang digunakan oleh proses yang sedang berjalan saat ini.


200
2017-09-17 18:14




Meskipun / proc / <pid> / environ memiliki ukuran 0, masih ada informasi di sana. "Lebih masuk akal jika Anda menganggapnya sebagai jendela ke kernel. File itu sebenarnya tidak berisi data; ia hanya bertindak sebagai penunjuk ke tempat informasi proses yang sebenarnya berada." [sumber] - nevets1219


Jawaban:


cat /proc/<pid>/environ

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

AlberT$ pidof sshd   
30690 6512 

EDIT:

Saya benar-benar mengutip @Teddy komentar untuk mencapai output yang lebih mudah dibaca:

xargs --null --max-args=1 < /proc/<pid>/environ

257
2017-09-17 18:18



Untuk membuatnya mudah dibaca, konversikan null ke newlines: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
aku selalu melakukan xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
penggunaan string yang lebih baik, cepat. Kucing masih lebih cepat :-) - Nikhil Mulley
Keseluruhan /proc filesystem tidak portabel. - Daniel H
Saya tidak mengerti mengapa menggunakan xargs untuk mengkonversi null ke newlines lebih baik daripada menggunakan tr. Bisakah seseorang membaringkannya untukku? Terima kasih. - Jonathan Hartley


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

ps -p <PID> -wwwe

atau

ps -p <PID> -wwwE

dan di Solaris dengan

/usr/ucb/ps -wwwe <PID>

Solaris juga mendukung /proc direktori jika Anda tidak ingin mengingat yang tidak jelas ps dulu


52
2017-09-17 20:47



Saya saya jalankan ps-p <PID> -kami pada OS X 10.6 Saya mendapatkan daftar semua proses yang sedang berjalan. perintah yang benar adalah dengan -E bendera, bukan -e. - drAlberT
Saya menguji pada OS X 10.4, tetapi tidak 10.5. Diperbarui sesuai. - Gerald Combs
Ini tidak sempurna. Opsi-E hanya melaporkan awal variabel lingkungan. Jika variabel telah diubah oleh proses yang berjalan itu sendiri (misalnya melalui penggunaan POSIX putenv () fungsi), perubahan tidak tercermin dalam output dari ps -p <PID> -wwE. - Kal
Tidak melihat berbagai proses tidak dimiliki oleh Anda terdengar seperti fitur yang diinginkan. Ini juga berlaku untuk jawaban yang menggunakan Linux @ drAlberT /proc/PID/environ. File-file itu hanya dapat dibaca oleh pemilik proses. - Jonathan Hartley
@yani Itu mungkin, tapi itu jauh lebih sulit, itu membutuhkan pemasangan debugger ke proses yang sedang berjalan. Lihat jawaban ini: unix.stackexchange.com/a/70636 - Kal


Seperti yang orang lain katakan, di Linux, Anda bisa melihat di / proc tetapi ada, tergantung pada versi kernel Anda, satu atau dua batasan:

Pertama-tama, file lingkungan mengandung lingkungan seperti yang terlihat ketika proses itu melahirkan. Itu berarti bahwa setiap perubahan yang mungkin dilakukan proses terhadap lingkungannya tidak akan terlihat dalam / 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 menumbuhkannya dengan sumber misalnya. .bashrc tapi / proc tidak mencerminkan ini. Shell yang kedua mewarisi lingkungan yang lebih besar dari awal, yang mengapa itu ditunjukkan dalam / proc.

Juga, pada kernel yang lebih tua, isi file lingkungan terbatas pada ukuran halaman (4K):

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

Antara 2,6,9 (RHEL4) dan 2,6,18 (RHEL5), batas ini dihapus ...


24
2017-10-29 11:27



Apakah mungkin untuk mendapatkan variabel lingkungan dari proses jarak jauh yang ditetapkan setelah proses itu melahirkan? Saya mengerti bahwa pada VFS, ini ditunjukkan dengan / proc / self / environ tetapi hanya jika kita berada di dalam proses. Tetapi bagaimana mendapatkan ini untuk proses jarak jauh? - Jeevan Patnaik


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

ps e $pid

atau

ps auxe  #for all processes

dan ya, halaman manual sangat membingungkan. (melalui)


10
2018-03-04 12:15



Ubuntu saya menghancurkan variabel lingkungan tepat terhadap baris perintah, bahkan tanpa banyak ruang di antara mereka, dan juga memotong ke satu baris di jendela terminal. saya menemukan ps eww $pid memperbaiki masalah kedua. - user18911
@ user18911: The env vars memiliki pemisah karakter nol. Jawaban lain di halaman ini menunjukkan cara untuk digunakan xargs atau tr untuk mengonversi ini ke baris baru agar terbaca. Anda mungkin menyadari ini selama empat tahun. - Jonathan Hartley


cat /proc/PID/environ

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

contoh: kucing / proc / 32512 / environ


7
2017-09-17 18:19





Di Linux, saya akan mencoba melihat

/proc/<pid>/environ

6
2017-09-17 18:19





Diambil dari Wiki Archlinux:

Anda dapat membuat fungsi sementara untuk mem-parsing nilai-nilai /proc/<pid>/environ. Pada prompt terminal:

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

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

envof <pid>

6
2018-01-13 23:05