C'è un modo per leggere le variabili d'ambiente di un altro processo usando Perl e in un ambiente Linux o Solaris?

StackOverflow https://stackoverflow.com/questions/518803

Domanda

In Perl, ho bisogno di leggere l'ambiente di altri processi.

  • Lo script è in esecuzione con la radice privilegi.
  • Lo script sarà esecuzione in Linux e Solaris.
  • vorrei una soluzione che è in gran parte indipendente dalla piattaforma, almeno tra Linux e Solaris. In Linux, esaminando il / ENV / / environ mi può ottenere la risposta.
  • vorrei evitare di dover forcella. Ho già una soluzione forking "/ usr / ucb / ps -auxwwwe $ pid"

Tutte le idee?

È stato utile?

Soluzione

Per Solaris, si potrebbe provare la procfs modulo da CPAN . Anche se questo modulo sembra ancora molto giovane, questa citazione suona speranza:

  

Brian Farrell ha inviato una patch molto utile che gestisce   ispezione di argv e l'ambiente dei processi   altro che il processo attualmente in esecuzione.

Immagino che questo è probabilmente solo l'ambiente iniziale (proprio come il environ di file sotto Linux), ma che sembra essere quello che vuoi?

In caso contrario, anche se ti vedo dire che non si vuole forcella, una soluzione semplice sarebbe probabilmente a manovella ~ 20 linee di C per la produzione di un piccolo programma che sputa appena fuori l'ambiente su Solaris come l'esatto equivalente di Linux pargs -e <pid> file. Ho qualcosa di molto simile in C già. Se siete interessati, posso postarlo.

EDIT (dopo aver letto OpenSolaris pargs.c): Il buffer ambiente viene riallocata sotto Solaris quando cambia l'ambiente, in modo che il puntatore PsInfo potrebbero non essere validi. Per una soluzione a prova di proiettile, è necessario dare la caccia ai _environ. Questo è tutto probabilmente più problemi di quanto è necessario ... ps(1) potrebbe essere un'alterativa più bello di UCB <=> se si fa andare via forcella, però.

Altri suggerimenti

In linux sembra che il /proc/<pid>/environ psuedofiles contengono la variabile environ passato quando è stato creato il processo. Se si dispone di autorizzazioni sufficienti, è possibile leggere quelli.

Non sembrano tenere traccia delle modifiche nell'ambiente processi dopo il lancio.

Ciò suggerisce che si dovrebbe disect il dump della memoria dei processi per ottenere quello che stai chiedendo.

Tricky.

Il pacchetto GNU 'binutils' include un'utilità denominata CLI strings. Vedere http://www.gnu.org/software/binutils/ per maggiori informazioni.

strings /proc/pid/environ - stampa fuori una bella lista di variabili di ambiente molto simile env.

La prima cosa che mi viene in mente sta usando GDB allegare al processo in questione, e poi chiedendo GDB per ottenere l'ambiente per voi. Si può fare questo con il comando "show ambiente" nel GDB shell.

Sembra che ci sia un modulo Perl che può fare questo per voi, Devel :: GDB . Non ho ancora provato, ma sembra una semplice questione di programmazione a creare l'oggetto Devel :: GDB, connettersi al processo che si desidera ispezionare, inviare il comando "show ambiente", e quindi analizzare la risultati.

Devo dire però ... quando la soluzione è questa complicata, è stanno probabilmente facendo qualcosa che non va. Perché è necessario il ambiente per un processo casuale, comunque?

Se PS può farlo, come dici tu, allora la vostra risposta può essere trovata da qualche parte nel codice sorgente di ps. Ciò permetterebbe di evitare la deposizione delle uova di un nuovo processo.

In Linux può essere sufficiente a risolvere il /proc/[pid]/cwd link simbolico, vedi procfs (5) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top