Il y a plus d'informations /proc/<pid>sur Linux, jetez un œil.
Sur d'autres Unix, les choses pourraient être différentes. La pscommande fonctionnera partout, le /proctruc est spécifique au système d'exploitation. Par exemple, sous AIX, il n'y a pas d' cmdlineentrée /proc.
sous linux, vous aurez probablement besoin de -ww (ie ps -ww -fp <pid>) pour spécifier une sortie large car s'il y a plusieurs commandes, elles pourraient être coupées.
cat /proc/<pid>/cmdlinefonctionne également sur Cygwin, où les arguments de ligne cmd ne sont affichés psavec aucune option.
lechup
3
Sous Linux, si vous avez seulement besoin d'obtenir le args, la commande est ps -o args -p <pid>et elle n'imprimera le argsou n'utilisera -o que cmdsi vous avez seulement besoin de voir le cmd. Essayer de lire /proc/<pid>/cmdlinene fonctionnera pas toujours pour les utilisateurs sans privilège. L' psutilitaire fonctionnera.
alvits
2
Astuce: la longueur de /proc/<pid>/cmdlineest limitée (codée en dur à la valeur du paramètre du noyau PAGE_SIZE), donc les lignes de commande plus longues sont toujours affichées tronquées! Voir stackoverflow.com/questions/199130/… pour plus d'informations. Vous pouvez interroger votre paramètre de noyau avec getconf PAGE_SIZE, c'est généralement 4096.
t0r0X
61
Ça fera l'affaire:
xargs -0 < /proc/<pid>/cmdline
Sans les xargs, il n'y aura pas d'espaces entre les arguments, car ils ont été convertis en NUL.
L'espace n'est pas supprimé, il est remplacé par des NUL.
bdonlan
@bdonlan Ah, je n'ai pas vérifié cela. Bonne prise!
lothar
4
xargs -0 echo </ proc / <pid> / cmdline. Vous pouvez également le faire avec / proc / <pid> / environ, bien que vous souhaitiez peut-être ajouter -n 1 pour cela.
camh
Sur mon système, il n'y a pas de système de fichiers / proc :( toute autre solution?
Hemant
Le mien est un processus java avec des paramètres long long long. C'est encore tronquer ma sortie. Un conseil?
johnsam
14
Vous pouvez utiliser pgrepavec -f(ligne de commande complète) et -l(description longue):
pgrep -l -f PatternOfProcess
Cette méthode a une différence cruciale avec toutes les autres réponses: elle fonctionne sur CygWin , vous pouvez donc l'utiliser pour obtenir la ligne de commande complète de tout processus exécuté sous Windows (exécutez comme élevé si vous voulez des données sur tout processus élevé / administrateur) . Toute autre méthode pour le faire sous Windows est plus gênante ( 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 pour les scripts s'exécutant dans le python de CygWin .
Pour info, vous pouvez également utiliser cat -v / proc / PID / cmdline | sed 's / \ ^ @ / \ n / g' . Cela remplacera le caractère nul par un caractère de nouvelle ligne. Ce faisant, chaque argument sera imprimé sur sa propre ligne. De cette façon, il est plus facile de distinguer un argument d'un autre.
En plus de toutes les façons ci-dessus pour convertir le texte, si vous utilisez simplement des "chaînes", cela produira la sortie sur des lignes séparées par défaut. Avec l'avantage supplémentaire, cela peut également empêcher l'apparition de caractères susceptibles de brouiller votre terminal.
Les deux sorties en une seule commande:
chaînes / proc // cmdline / proc // environ
La vraie question est ... existe-t-il un moyen de voir la vraie ligne de commande d'un processus sous Linux qui a été modifié de sorte que la cmdline contienne le texte modifié au lieu de la commande réelle qui a été exécutée.
Si vous souhaitez obtenir un délai aussi long que possible (vous ne savez pas quelles sont les limites), similaire aux paramètres de Solaris , vous pouvez l'utiliser sur Linux et OSX:
tr \\0 ' ' < /proc/<pid>/cmdline
Réponses:
Il existe plusieurs options:
Il y a plus d'informations
/proc/<pid>
sur Linux, jetez un œil.Sur d'autres Unix, les choses pourraient être différentes. La
ps
commande fonctionnera partout, le/proc
truc est spécifique au système d'exploitation. Par exemple, sous AIX, il n'y a pas d'cmdline
entrée/proc
.la source
ps -ww -fp <pid>
) pour spécifier une sortie large car s'il y a plusieurs commandes, elles pourraient être coupées.-ww
option permet d'accéder aux arguments de ligne de commande complets (autant que ceux stockés par le noyau). Voir aussi: comment solaris et bsd obtiennent les paramètres de ligne de commande non tronqués pour un processus et des options pscat /proc/<pid>/cmdline
fonctionne également sur Cygwin, où les arguments de ligne cmd ne sont affichésps
avec aucune option.args
, la commande estps -o args -p <pid>
et elle n'imprimera leargs
ou n'utilisera -o quecmd
si vous avez seulement besoin de voir lecmd
. Essayer de lire/proc/<pid>/cmdline
ne fonctionnera pas toujours pour les utilisateurs sans privilège. L'ps
utilitaire fonctionnera./proc/<pid>/cmdline
est limitée (codée en dur à la valeur du paramètre du noyau PAGE_SIZE), donc les lignes de commande plus longues sont toujours affichées tronquées! Voir stackoverflow.com/questions/199130/… pour plus d'informations. Vous pouvez interroger votre paramètre de noyau avecgetconf PAGE_SIZE
, c'est généralement 4096.Ça fera l'affaire:
Sans les xargs, il n'y aura pas d'espaces entre les arguments, car ils ont été convertis en NUL.
la source
xargs -0 < /proc/<pid>/cmdline
.Ligne de commande complète
Pour les systèmes Linux et Unix, vous pouvez utiliser
ps -ef | grep process_name
pour obtenir la ligne de commande complète.Sur les systèmes SunOS, si vous souhaitez obtenir la ligne de commande complète, vous pouvez utiliser
Pour obtenir la ligne de commande complète, vous devez devenir super utilisateur.
Liste des arguments
donnera une liste détaillée des arguments passés à un processus. Il affichera le tableau d'arguments comme ceci:
Je n'ai trouvé aucune commande similaire pour Linux, mais j'utiliserais la commande suivante pour obtenir une sortie similaire:
la source
Sous Linux
vous obtenez la ligne de commande du processus (y compris les arguments) mais avec tous les espaces blancs modifiés en caractères NUL.
la source
Vous pouvez utiliser
pgrep
avec-f
(ligne de commande complète) et-l
(description longue):Cette méthode a une différence cruciale avec toutes les autres réponses: elle fonctionne sur CygWin , vous pouvez donc l'utiliser pour obtenir la ligne de commande complète de tout processus exécuté sous Windows (exécutez comme élevé si vous voulez des données sur tout processus élevé / administrateur) . Toute autre méthode pour le faire sous Windows est plus gênante ( 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 pour les scripts s'exécutant dans le python de CygWin .
la source
$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
pgrep from procps-ng 3.3.15
et3.3.12
. Imprime simplement le nom pid et prorgam sans arguments.Une autre variante de l'impression
/proc/PID/cmdline
avec des espaces sous Linux est:De cette façon,
cat
imprime les caractères NULL en tant que^@
, puis vous les remplacez par un espace utilisantsed
;echo
imprime une nouvelle ligne.la source
Vous pouvez simplement utiliser:
la source
Plutôt que d'utiliser plusieurs commandes pour éditer le flux, utilisez simplement one - tr traduit un caractère en un autre:
la source
En plus de toutes les façons ci-dessus pour convertir le texte, si vous utilisez simplement des "chaînes", cela produira la sortie sur des lignes séparées par défaut. Avec l'avantage supplémentaire, cela peut également empêcher l'apparition de caractères susceptibles de brouiller votre terminal.
Les deux sorties en une seule commande:
chaînes / proc // cmdline / proc // environ
La vraie question est ... existe-t-il un moyen de voir la vraie ligne de commande d'un processus sous Linux qui a été modifié de sorte que la cmdline contienne le texte modifié au lieu de la commande réelle qui a été exécutée.
la source
Sur Solaris
similaire peut être utilisé sur des systèmes de type Unix.
la source
Sous Linux, avec bash, pour afficher les arguments entre guillemets afin que vous puissiez modifier la commande et la réexécuter
Sous Solaris, avec bash (testé avec la version 3.2.51 (1)) et sans espace utilisateur gnu:
Exemple de bash Linux (coller dans le terminal):
Production:
Exemple de Solaris Bash:
Production:
la source
Si vous souhaitez obtenir un délai aussi long que possible (vous ne savez pas quelles sont les limites), similaire aux paramètres de Solaris , vous pouvez l'utiliser sur Linux et OSX:
la source
essayez
ps -n
dans un terminal linux. Cela montrera:1.Tous les processus RUNNING , leur ligne de commande et leurs PID
Ensuite, vous saurez quel processus tuer
la source