44 votes

Comment puis-je inspecter les variables d'environnement d'un processus en cours d'exécution ?

Existe-t-il un équivalent (CLI ou GUI) de la fonction /proc/$PID/environ fonction ?

1 votes

Essayez ps eww <PID> dans le terminal.

52voto

Mateusz Szlosek Points 21762

Vous pouvez inspecter les variables environnementales du processus en cours avec

ps eww <PID>

5 votes

Existe-t-il un moyen d'imprimer ces données après coup ?

1 votes

Je suis sur MacOS 10.14.4 et cela ne fonctionne pas pour moi :(

1 votes

Cela fonctionne pour moi sur MacOS 10.15.1.

22voto

Bluefire Points 387

Ce qui suit complète la réponse de Mateusz, en imprimant les variables une par ligne :

ps eww -o command <PID>  | tr ' ' '\n'

1 votes

Il est utile et la réponse sera meilleure si vous expliquez ce que fait chaque composant.

3 votes

Si vous êtes curieux, expliquehell peut décomposer ça.

1 votes

Cela ne fonctionne pas si les valeurs des variables d'environnement contiennent des espaces.

0voto

Voir la fonction EnvironFromProcId() :

https://github.com/time-killer-games/xproc/blob/main/crossprocess.cpp

void EnvironFromProcId(PROCID procId, char ***buffer, int *size)

A partir du PROCID spécifié, (typedef pour DWORD / unsigned long sous Windows, sinon pid_t / int pour Mac, Linux et autres Unix), la fonction doit copier un vecteur de chaînes d'environnement (NOM=VALEUR) dans 'buffer', et la quantité de chaînes doit être copiée dans 'size'. Cette fonction n'est pas thread safe, cependant la source peut être modifiée pour qu'elle devienne thread safe. Notez que cette fonction utilise une structure incomplètement documentée sous Windows, et afin de pouvoir lire le bloc d'environnement entre (vers et depuis) les processus 32 bits et 64 bits, elle utilise une méthode qui n'est pas aussi performante que sur les autres plateformes. Il est construit avec des exécutables secondaires compilés directement dans l'exécutable initial, qui est extrait dans le répertoire temporaire de Windows au moment de l'exécution, et s'exécute à partir de là. Selon l'architecture de l'image exécutable associée au processus cible, cela déterminera l'architecture de l'exécutable secondaire à exécuter. Écrit pour Windows, Mac, Linux et FreeBSD. Besoin d'Ubuntu / Debian libprocps-dev également libx11-dev si elle est compilée en utilisant le build*w.sh construire des scripts qui incluent du code de fenêtrage, (pas par défaut). FreeBSD aura besoin de libX11 si elle est construite avec des fenêtres.

Ou bien, compilez à partir du code source en utilisant les scripts de compilation scripts (MinGW / g++ sur Windows / Linux, clang sur Mac / FreeBSD), puis exécutez à partir de la ligne de commande en passant le paramètre --env-from-pid pid paramètres de la ligne de commande. Passez le paramètre --help pour obtenir la liste de toutes les options possibles.

Par commodité, l'exemple d'utilisation est dans main.cpp (le code CLI réel) : https://github.com/time-killer-games/xproc/blob/fe14ec70e4e58359ddf3d29aa03c86328c97b49b/main.cpp#L153

1 votes

Le lien ne fonctionne plus.

1 votes

@DanielWiddis merci pour la notification, je viens de la corriger.

1 votes

Excellent. Lien utile, qui confirme des informations que j'ai vues ailleurs mais qui sont plus faciles à digérer. Je vous suggère de mettre à jour votre réponse pour mettre en évidence les étapes clés que le code effectue (Call NtQueryInformationProcess alors ReadProcessMemory du PEB, puis les ProcessParameters et enfin l'Environnement.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X