Unix'te çalışan bir işlemin ortam değişkenleri?


231

Unix sistemindeki ortam değişkenleriyle ilgili bazı sorunları gidermem gerekiyor.

Windows'ta, belirli bir işlemi seçmek ve her ortam değişkeninin değerlerini görüntülemek için ProcessExplorer gibi bir araç kullanabilirim.

Unix'te aynı şeyi nasıl başarabilirim? echoingve envcmd şu anda yalnızca değerleri gösterir, ancak çalışan işlemin şu anda hangi değerleri kullandığını görmek istiyorum.


2
/ Proc / <pid> / environment 0 boyutunda olsa da, orada hala bilgi var. “Çekirdeğe bir pencere olarak düşünürseniz daha anlamlı olur. Dosya aslında herhangi bir veri içermiyor; yalnızca gerçek işlem bilgilerinin bulunduğu yere bir işaretçi gibi davranıyor.” [kaynak ]
nevets1219

Yanıtlar:


295
cat /proc/<pid>/environ

Belirli bir çalışan çalıştırılabilir dosyaya sahip olmak isterseniz, diğer bazı olasılıkların yanı sıra şunları da kullanabilirsiniz pidof:

AlberT$ pidof sshd   
30690 6512 

EDIT :

Daha okunaklı bir çıktı elde etmek için Dennis Williamson ve Teddy yorumlarından alıntı yapıyorum . Benim çözümüm şudur:

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

46
Okunabilir hale getirmek için, boş satırları yeni satırlara dönüştürün:cat /proc/17330/environ | tr \\0 \\n
Dennis Williamson

32
Her zaman yaparımxargs --null --max-args=1 echo < /proc/PID/environ
Teddy

7
dizeleri daha iyi kullanmak, hızlı. Kedi hala daha hızlı :-)
Nikhil Mulley 14:12 'de

3
Tüm /procdosya sistemi taşınabilir değildir.
Daniel H,

6
Neden xargsnull'ları newline'lara dönüştürmenin kullanılmasının kullanmaktan daha iyi olduğunu anlamıyorum tr. Birisi benim için düzenleyebilir mi? Teşekkürler.
Jonathan Hartley

61

Bu soru bir unix etiketine sahip olduğundan ve herkes linux etiketi için bu kadar harika bir iş çıkardığından , bu bilgiyi OS X ve BSD'den türetilmiş diğer sistemler üzerinde bulabilirsiniz.

ps -p <PID> -wwwe

veya

ps -p <PID> -wwwE

ve Solaris'te

/usr/ucb/ps -wwwe <PID>

Solaris ayrıca /proc, belirsiz pskomutları hatırlamak istemiyorsanız , dizini de destekler .


3
II çalıştırmak ps -p <PID> -wwwe'de OS X 10.6 Çalışan tüm işlemlerin listesini alıyorum. sağ komut, -E bayrağı ile değil -e iledir.
drAlberT

1
OS X 10.4'te test ettim ancak 10.5 değil. Buna göre güncellendi.
Gerald Combs

4
Bu mükemmel değil. -E seçeneği yalnızca ilk ortam değişkenlerini bildirir . Değişkenler çalışan işlemin kendisi tarafından değiştirilmişse (örneğin POSIX putenv () işlevinin kullanılmasıyla), değişiklikler çıktıya yansıtılmaz ps -p <PID> -wwE.
Kal

1
Env'yi görmemek size ait olmayan işlem çeşitlerini arzu edilen bir özellik gibi gözüküyor. Aynı zamanda @ drAlberT'in Linux yönelimli cevap kullanması için de geçerlidir /proc/PID/environ. Bu dosyalar yalnızca işlemin sahibi tarafından okunabilir.
Jonathan Hartley

1
@yani Mümkün, ancak çok daha zor, bu işlem için bir hata ayıklayıcı eklemek gerekiyor. Bu cevabı gör: unix.stackexchange.com/a/70636
Kal

25

Diğerlerinin de belirttiği gibi, Linux'ta / proc'a bakabilirsiniz ancak çekirdek sürümünüze bağlı olarak bir veya iki sınır vardır:

Her şeyden önce, ortam dosyası, işlem oluşturulduğunda bakıldığı gibi ortamı içerir. Bu, işlemin çevrede yapabileceği herhangi bir değişikliğin / proc içerisinde görünmeyeceği anlamına gelir:

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

İlk kabuk bir giriş kabuğudur ve başlangıçta çok sınırlı bir ortama sahiptir, ancak örneğin .bashrc'yi kaynaklayarak büyütür, ancak / proc bunu yansıtmaz. İkinci kabuk daha büyük ortamı başlangıçtan itibaren devralır, bu yüzden / proc'ta gösteriliyor.

Ayrıca, daha eski çekirdeklerde, ortam dosyasının içeriği sayfa boyutuyla (4K) sınırlıdır:

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

2.6.9 (RHEL4) ve 2.6.18 (RHEL5) arasında bir yerde bu limit kaldırıldı ...


1
Sürecin oluşturulmasından sonra ayarlanan uzak bir sürecin çevresel değişkenlerini elde etmek mümkün müdür? VFS'de / proc / self / environ ile gösterildiğini ancak işlemin içindeyken olduğunu anlıyorum. Fakat bunun uzak bir süreç için nasıl elde edileceği?
GP92,

11

Bunu yapmak için BSD seçeneklerinin doğru kullanımı (en azından Linux'ta):

ps e $pid

veya

ps auxe  #for all processes

ve evet, ps manpage oldukça kafa karıştırıcı. ( ile )


Ubuntu'm ortam değişkenlerini komut satırına, aralarında boşluk kalmayacak şekilde kırar ve terminal penceresindeki bir satıra kısalır. Bulduğum ps eww $pidDüzeltmeler 2 sorunu.
user18911

1
@ user18911: env vars boş karakter ayırıcısına sahiptir. Bu sayfadaki diğer cevaplar okunabilirlik için bunları kullanma xargsveya tryeni satırlara dönüştürme yollarını gösterir . Muhtemelen bunu müdahale eden dört yılda fark ettin.
Jonathan Hartley

7
cat /proc/PID/environ

PID'yi, görmek istediğiniz işlemin PID'i ile değiştirin. Çalışan bir işlem hakkında her bilgi / proc / PID / dizin altında

örnek: kedi / proc / 32512 / çevre


7

Archlinux wiki'den alınmış :

İçindeki değerleri ayrıştırmak için geçici bir işlev oluşturabilirsiniz /proc/<pid>/environ. Terminal isteminde:

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

Sonra istediğiniz işlemin pid ile, sadece kullanın:

envof <pid>

6

Linux altında bakmaya çalışacağım

/proc/<pid>/environ


5

Seyrek olarak belgelenmesine rağmen, içeriği /proc/<pid>/environyalnızca süreci başlatmak için kullanılan ortamı içerecektir.

Bir sürecin mevcut ortamını incelemeniz gerekiyorsa, bunu yapmanın bir yolu da kullanmaktır 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

Ve işim beni AIX hayranı olmaya zorladığından, unutmayalım:

ps eww [pid]

Veya man sayfasının adıyla "Berkeley Standards".

Hangi nedenle olursa olsun, / proc / PID / ortam AIX'te mevcut değildir.


2

envKeyfi bir işlem için ortam değişkenlerinin çıktısı gibi biçimlendirilmiş bir oluşturmak (PID) istiyorsanız, uygun bir bash penv <pid>komutu (işletim sisteminize göre uyarlanmış) oluşturabilir ve kendi dizinize ekleyebilirsiniz .bashrc:

Linux bunu ~ / .bashrc dosyasına ekleyin:

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

macOS / BSD bunu ~ / .bashrc dosyasına ekleyin:

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

Solaris bunu ~ / .bashrc dosyasına ekleyin:

penv() {
   pargs -e $1
}

Kullanımı:

$ kaynak $ 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: 49 = bn; 39: se = 50; 39
DİL = en_US.UTF-8
YAYIN = vim
XDG_SESSION_ID = 106
KULLANICI = kök
PWD = / root
ANA = / root
SSH_CLIENT = 1.1.1.242 53960 22
SSH_TTY = / dev / / 3 puanlar
POSTA = / var / mail / root
SÜRESİ = xterm-256color
SHELL = / bin / bash
SHLVL = 1
LOGNAME = kök
DBUS_SESSION_BUS_ADDRESS = Unix: yol = / run / user / 0 / otobüs
XDG_RUNTIME_DIR = / çalıştırma / kullanıcı / 0
PATH = / root / bin: / bin / sbin: / usr / bin: / usr / sbin: / usr / local / bin: / usr / local / sbin :.
VBOX_LOG_FLAGS = iş parçacığı tsc
VBOX_LOG =-tüm + dev_vmm_backdoor.elf + dev_vmm.elf

0

Bir mac çözümü, muhtemelen diğer BSD'ler de bunun gibi bir şey olabilir

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

Ortam değişkenleri komut satırına eklenir, bu komut satırını kaldırır ve yalnızca ortam değişkenleri kaldı.

Mükemmel değil çünkü boşlukla ayrılmışlar LF ile ayrılmışlar


-1

/ Proc / PID / Environ

Bunun için, öncelikle sürecin PID'sini tanımlamamız gerekir. Bunun için ps komutunu kullanabilirsiniz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.