Vraag Omgevingsvariabelen van een lopend proces op Unix?


Ik moet een aantal problemen met betrekking tot omgevingsvariabelen op een Unix-systeem oplossen.

In Windows kan ik een tool zoals ProcessExplorer gebruiken om een ​​specifiek proces te selecteren en de waarden van elke omgevingsvariabele te bekijken.

Hoe kan ik hetzelfde bereiken met Unix? echoing en env cmd toont gewoon waarden op dit moment, maar ik wil bekijken welke waarden het lopende proces momenteel gebruikt.


200
2017-09-17 18:14


oorsprong


Hoewel / proc / <pid> / environ een grootte heeft van 0, is er nog steeds informatie. "Het is logischer als je het ziet als een venster in de kernel.Het bestand bevat eigenlijk geen gegevens, het fungeert alleen als een verwijzing naar waar de feitelijke procesinformatie zich bevindt." [bron] - nevets1219


antwoorden:


cat /proc/<pid>/environ

Als je pid (s) van een bepaald uitvoerend bestand wilt hebben, kun je dit, naast een aantal andere mogelijkheden, gebruiken pidof:

AlberT$ pidof sshd   
30690 6512 

BEWERK:

Ik citeer @Teddycommentaar volledig om een ​​beter leesbare uitvoer te krijgen:

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

257
2017-09-17 18:18



Om het leesbaar te maken, converteer je de nulls naar newlines: cat /proc/17330/environ | tr \\0 \\n - Dennis Williamson
Dat doe ik altijd xargs --null --max-args=1 echo < /proc/PID/environ - Teddy
beter gebruik maken van snaren, het is snel. Cat is nog steeds sneller :-) - Nikhil Mulley
Het geheel /proc bestandssysteem is niet draagbaar. - Daniel H
Ik begrijp niet waarom gebruiken xargs om nulls naar newlines te converteren is beter dan gebruiken tr. Kan iemand het voor me neerleggen? Bedankt. - Jonathan Hartley


Omdat deze vraag een unix tag en iedereen heeft zo goed werk verricht linux tag, kunt u deze informatie over OS X en andere BSD-afgeleide systemen gebruiken

ps -p <PID> -wwwe

of

ps -p <PID> -wwwE

en op Solaris met

/usr/ucb/ps -wwwe <PID>

Solaris ondersteunt ook de /proc map als je het onbekende niet wilt onthouden ps commmand.


52
2017-09-17 20:47



Ik loop weg ps -p <PID> -wwwe op OS X 10.6 krijg ik de lijst met alle lopende processen. de juiste opdracht is met -E vlag, niet -E. - drAlberT
Ik heb getest op OS X 10.4, maar niet op 10.5. Dienovereenkomstig bijgewerkt. - Gerald Combs
Dit is niet perfect. De optie -E rapporteert alleen de eerste omgevingsvariabelen. Als de variabelen zijn gewijzigd door het lopende proces zelf (bijvoorbeeld door het gebruik van de functie POSIX putenv ()), worden de wijzigingen niet weerspiegeld in de uitvoer van ps -p <PID> -wwE. - Kal
Het niet zien van env vars van processen die niet van jou zijn, klinkt als een gewenste functie. Het is ook het geval voor het op Linux gebaseerde antwoord van @ drAlberT /proc/PID/environ. Die bestanden kunnen alleen worden gelezen door de eigenaar van het proces. - Jonathan Hartley
@yani Het is mogelijk, maar het is veel moeilijker, het vereist het toevoegen van een foutopsporing aan het lopende proces. Zie dit antwoord: unix.stackexchange.com/a/70636 - Kal


Zoals anderen al hebben vermeld, kun je in Linux kijken in / proc, maar er zijn, afhankelijk van je kernelversie, een of twee limieten:

Allereerst bevat het bestand environ de omgeving zoals deze eruitzag toen het proces werd voortgebracht. Dat betekent dat eventuele wijzigingen die het proces in zijn omgeving heeft aangebracht niet zichtbaar zijn in / proc:

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

De eerste schaal is een login-shell en heeft aanvankelijk een zeer beperkte omgeving maar groeit deze door sourcing, b.v. .bashrc but / proc geeft dit niet weer. De tweede shell erft de grotere omgeving vanaf het begin, wat het daarom laat zien in / proc.

In oudere kernels is de inhoud van het omgevingsbestand beperkt tot een paginaformaat (4K):

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

Ergens tussen 2,6,9 (RHEL4) en 2,6.18 (RHEL5) is deze limiet verwijderd ...


24
2017-10-29 11:27



Is het mogelijk om de omgevingsvariabelen van een proces op afstand te verkrijgen die zijn ingesteld nadat het proces is gestart? Ik begrijp dat op VFS het wordt getoond met / proc / self / environ, maar alleen als we ons in het proces bevinden. Maar hoe krijg je dit voor een proces op afstand? - Jeevan Patnaik


correct gebruik van BSD-opties om dit te doen (tenminste op Linux):

ps e $pid

of

ps auxe  #for all processes

en ja, ps manpage is behoorlijk verwarrend. (via)


10
2018-03-04 12:15



Mijn Ubuntu slaat de omgevingsvariabelen tegen de commandoregel, zonder zelfs maar een spatie ertussen, en kapt ook af naar een regel in het terminalvenster. ik vond ps eww $pid lost het 2e probleem op. - user18911
@ user18911: De env vars hebben een scheidingsteken voor null-tekens. Andere antwoorden op deze pagina tonen manieren om te gebruiken xargs of tr om deze naar nieuwe regels om te zetten voor leesbaarheid. U hebt dit waarschijnlijk in de tussenliggende vier jaar gerealiseerd. - Jonathan Hartley


cat /proc/PID/environ

vervang PID door de PID van het proces dat u wilt zien. Alle informatie over een lopend proces is onder / proc / PID / directory

voorbeeld: cat / proc / 32512 / environ


7
2017-09-17 18:19





Onder Linux zou ik het eens proberen

/proc/<pid>/environ

6
2017-09-17 18:19





Genomen uit de Archlinux wiki:

U kunt een tijdelijke functie maken om de waarden in te ontleden /proc/<pid>/environ. Op de terminalprompt:

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

Gebruik vervolgens, met de pid van het gewenste proces, gewoon:

envof <pid>

6
2018-01-13 23:05





Voor Solaris 5.10 werkt dit:

pargs -e <PID>

4
2017-08-08 10:04





En omdat ik van mijn baan een AIX-fan ben, mogen we niet vergeten:

ps eww [pid]

Of zoals de man-pagina het noemt, "Berkeley Standards".

Om welke reden dan ook, / proc / PID / environ bestaat niet in AIX.


3
2018-01-19 15:03





Hoewel vrij dunbeschreven, de inhoud van /proc/<pid>/environ bevat alleen de omgeving die is gebruikt om het proces te starten.

Als u de huidige status van een procesomgeving wilt inspecteren, kunt u dat doen door te gebruiken 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
2018-02-13 16:22





Een mac-oplossing, waarschijnlijk ook andere BSD's, zou zoiets kunnen zijn

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

De omgevingsvariabelen worden toegevoegd aan de opdrachtregel, hierdoor wordt de opdrachtregel verwijderd en blijven alleen de omgevingsvariabelen over.

Het is niet perfect omdat ze gescheiden zijn in de ruimte en niet van elkaar zijn gescheiden


0
2018-06-22 06:17