it-swarm.asia

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

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

Windows'da, 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.

Aynı şeyi Unix'te nasıl başarabilirim? echoing ve env cmd sadece şu anda değerleri gösterir, ancak çalışan işlemin şu anda hangi değerleri kullandığını görmek istiyorum.

235
m3rLinEz
cat /proc/<pid>/environ

Belirli bir çalışan yürütülebilir dosyanın pid (ler) ine sahip olmak istiyorsanız, diğer birçok olasılık arasında pidof kullanabilirsiniz:

AlberT$ pidof sshd   
30690 6512 

[~ # ~] düzenlemek [~ # ~] :

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

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

Bu soru nix etiketine sahip olduğundan ve herkes bu kadar iyi bir iş adresleme linux etiketine sahip olduğundan, bu bilgileri OS X ve diğer BSD'den türetilen sistemlerde

ps -p <PID> -wwwe

veya

ps -p <PID> -wwwE

ve Solaris ile

/usr/ucb/ps -wwwe <PID>

Solaris ayrıca /proc dizin belirsiz ps komutunu hatırlamak istemiyorsanız.

63
Gerald Combs

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, environ dosyası, işlemin ortaya çıktığı zamanki ortamı içerir. Bu, işlemin ortamında yaptığı herhangi bir değişikliğin/proc içinde 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 kaynak sağlayarak ör. .bashrc ama/proc bunu yansıtmaz. İkinci Kabuk daha büyük ortamı en başından devralır, bu yüzden/proc içinde gösterir.

Ayrıca, eski çekirdeklerde environ dosyasının içeriği sayfa boyutu (4K) ile 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 sınır kaldırıldı ...

25
Lasse

bunu yapmak için BSD seçeneklerinin doğru kullanımı (en azından linux'da):

ps e $pid

veya

ps auxe  #for all processes

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

11
raincrumb

Oldukça az belgelenmiş olsa da, /proc/<pid>/environ yalnızca işlemi başlatmak için kullanılan ortamı içerir.

Bir işlem ortamının geçerli durumunu denetlemeniz gerekiyorsa, bunu yapmanın bir yolu gdb kullanmaktır.

# 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

pID'yi görmek istediğiniz işlemin PID'si ile değiştirin. Çalışan bir işlemle ilgili her bilgi/proc/PID/dizini altındadır

örnek: cat/proc/32512/environ

7
kargig

Archlinux wiki :

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

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

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

envof <pid>
7
mwotton

Solaris 5.10 için bu işe yarar:

pargs -e <PID>
6
Mykola Novik

Linux altında,

/proc/<pid>/environ
6
Joril

Ve işim beni AIX hayranı çocuğu yaptığım için unutmayalım:

ps eww [pid]

Ya da man sayfasının dediği gibi "Berkeley Standards".

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

4
Corey S.

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

Linux bunu ~/.bashrc'nize ekleyin:

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

macOS/BSD bunu ~/.bashrc'nize ekleyin:

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

Solaris bunu ~/.bashrc'nize ekleyin:

penv() {
   pargs -e $1
}

Kullanımı:

 $ 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 [. .____] DİL = en_US.UTF-8 [. .____] YAYIN = vim [. .____] XDG_SESSION_ID = 106 [. .____] KULLANIM = kök [. .____] PWD =/kök 
 HOME =/kök 
 SSH_CLIENT = 1.1.1.242 53960 22 
 SSH_TTY =/dev/pts/3 
 MAIL =/var/mail/root 
 SÜRESİ = xterm-256color [.____] Kabuk =/bin/deneme [.____] SHLVL = 1 [.____] LOGNAME = kök [.____] DBUS_SESSION_BUS_ADDRESS = unix.:... yolu =/çalıştırma/kullanıcı/0/otobüs 
 XDG_RUNTIME_DIR =/run/user/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 = -all + dev_vmm_backdoor.elf + dev_vmm.elf 
3
clearlight

Bir mac çözümü, muhtemelen diğer BSD'ler de benzer 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 ayrılmış

0
Erik Martino