213 votes

Comment obtenir les arguments de ligne de commande passés à un processus en cours d'exécution sur les systèmes Unix/Linux?

Sur SunOS, il y a la commande pargs qui affiche les arguments de ligne de commande passés au processus en cours d'exécution.

Y a-t-il une commande similaire sur d'autres environnements Unix ?

4 votes

tr \\0 ' ' < /proc/<pid>/cmdline

321voto

markus_b Points 1120

Il existe plusieurs options :

ps -fp 
cat /proc//cmdline | sed -e "s/\x00/ /g"; echo

Il y a plus d'informations dans /proc/ sur Linux, il suffit de jeter un coup d'œil.

Sur d'autres Unix, les choses peuvent être différentes. La commande ps fonctionnera partout, les choses dans /proc sont spécifiques au système d'exploitation. Par exemple, sur AIX, il n'y a pas de cmdline dans /proc.

53 votes

Sur Linux, vous aurez probablement besoin de -ww (c'est-à-dire ps -ww -fp ) pour spécifier une sortie large car s'il y a plusieurs commandes, elles pourraient être coupées.

1 votes

Pour clarification, le fichier n'est pas // mais plutôt /proc/

2 votes

La balise -ww permet d'accéder aux arguments complets de la ligne de commande (autant que stocké par le noyau). Voir aussi: comment solaris et bsd obtiennent les paramètres de ligne de commande non tronqués pour un processus et options de ps

64voto

Buddy Casino Points 848

Cela fera l'affaire :

xargs -0 < /proc//cmdline

Sans les xargs, il n'y aura pas d'espaces entre les arguments, car ils ont été convertis en NULs.

3 votes

Cela peut être raccourci en xargs -0 < /proc//cmdline.

0 votes

Il tronque toujours ma sortie. Des conseils ?

0 votes

Jamais remarqué de troncature - pouvez-vous donner un exemple ?

23voto

LOGAN Points 60

Commande complète

Pour les systèmes Linux et Unix, vous pouvez utiliser ps -ef | grep process_name pour obtenir la commande complète.

Sur les systèmes SunOS, si vous voulez obtenir la commande complète, vous pouvez utiliser

/usr/ucb/ps -auxww | grep -i process_name

Pour obtenir la commande complète, vous devez devenir super utilisateur.

Liste des arguments

pargs -a PROCESS_ID

donnera une liste détaillée des arguments passés à un processus. Il affichera le tableau des arguments de cette manière:

argv[0]: premier argument
argv[1]: deuxième..
argv[*]: et ainsi de suite..

Je n'ai pas trouvé de commande similaire pour Linux, mais j'utiliserais la commande suivante pour obtenir une sortie similaire:

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

0 votes

ps -ef est la commande que je cherchais.

18voto

Vous pouvez utiliser pgrep avec -f (ligne de commande complète) et -l (description étendue) :

pgrep -l -f ModèleDeProcessus

Cette méthode présente une différence cruciale avec toutes les autres réponses : elle fonctionne sous CygWin, donc vous pouvez l'utiliser pour obtenir la ligne de commande complète de n'importe quel processus s'exécutant sous Windows (exécutez en tant qu'élevé si vous voulez des données sur n'importe quel processus élevé/administrateur). Toute autre méthode pour faire cela sous Windows est plus compliquée (par exemple).
De plus : dans mes tests, la méthode pgrep a été le seul système qui a fonctionné pour obtenir le chemin complet des scripts s'exécutant à l'intérieur de python de CygWin.

0 votes

Celui-ci imprime en fait le nom exécutable original aussi: $ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash

0 votes

Ne fonctionne pas pour moi en utilisant pgrep from procps-ng 3.3.15 et 3.3.12. Imprime juste l'ID de processus et le nom du programme sans arguments.

15voto

lothar Points 11904

Sur Linux

cat /proc//cmdline

renvoie la ligne de commande du processus (commande incluant les arguments) chaque enregistrement étant terminé par un caractère NUL.

Un exemple de Shell Bash:

$ mapfile -d '' args < /proc/$$/cmdline
$ echo "#${#args[@]}:" "${args[@]}"
#1: /bin/bash
$ echo $BASH_VERSION
5.0.17(1)-release

3 votes

Les espaces blancs ne sont pas supprimés, ils sont remplacés par des NULs.

0 votes

@bdonlan Ah, je n'ai pas vérifié cela. Bien vu!

4 votes

Xargs -0 echo < /proc//cmdline. Vous pouvez également le faire avec /proc//environ aussi, bien que vous puissiez vouloir ajouter -n 1 pour cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X