GNU/Linux >> Linux Esercitazione >  >> Linux

Variabili d'ambiente di un processo in esecuzione su Unix?

Soluzione 1:

cat /proc/<pid>/environ

Se vuoi avere pid(s) di un dato eseguibile in esecuzione puoi, tra una serie di altre possibilità, usare pidof :

AlberT$ pidof sshd   
30690 6512 

MODIFICA :

Cito totalmente i commenti di Dennis Williamson e Teddy per ottenere un output più leggibile. La mia soluzione è la seguente:

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

Soluzione 2:

Poiché questa domanda ha un unix tag e tutti gli altri hanno fatto un ottimo lavoro con linux tag, puoi ottenere queste informazioni su OS X e altri sistemi derivati ​​da BSD usando

ps -p <PID> -wwwe

o

ps -p <PID> -wwwE

e su Solaris con

/usr/ucb/ps -wwwe <PID>

Solaris supporta anche /proc directory se non vuoi ricordare l'oscuro ps comando.

Soluzione 3:

Come altri hanno già detto, su Linux puoi cercare in /proc ma ci sono, a seconda della versione del tuo kernel, uno o due limiti:

Prima di tutto, il file environ contiene l'ambiente come appariva quando è stato generato il processo. Ciò significa che qualsiasi modifica che il processo potrebbe aver apportato al suo ambiente non sarà visibile in /proc:

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

La prima shell è una shell di login e inizialmente ha un ambiente molto limitato ma lo fa crescere procurandosi ad es. .bashrc ma /proc non lo riflette. La seconda shell eredita l'ambiente più grande dall'inizio, motivo per cui viene mostrato in /proc.

Inoltre, sui kernel più vecchi, il contenuto del file environ è limitato a una dimensione di pagina (4K):

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

Da qualche parte tra 2.6.9 (RHEL4) e 2.6.18 (RHEL5) questo limite è stato rimosso...

Soluzione 4:

uso corretto delle opzioni BSD per farlo (almeno su Linux):

ps e $pid

o

ps auxe  #for all processes

e sì, la manpage di ps è piuttosto confusa.(via)

Soluzione 5:

Anche se piuttosto scarsamente documentato, il contenuto di /proc/<pid>/environ conterrà solo l'ambiente utilizzato per avviare il processo.

Se hai bisogno di ispezionare lo stato corrente dell'ambiente di un processo, un modo per farlo è usare 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

Linux
  1. Cambiare l'ambiente di un processo in esecuzione?

  2. Quale processo ha Pid 0?

  3. Come ottenere gli argomenti della riga di comando passati a un processo in esecuzione su sistemi unix/linux?

  4. Come sapere se è in esecuzione in una console Linux rispetto a una sessione ssh?

  5. Controllo delle variabili di ambiente

Processi in esecuzione

Fare riferimento a variabili d'ambiente *in* /etc/environment?

Variabili d'ambiente Linux

Determinazione del particolare processore su cui è in esecuzione un processo

Le variabili di ambiente sono visibili agli utenti non privilegiati su Linux?

I file .pid sono affidabili per determinare se un processo è in esecuzione?