Comment obtenir uniquement l'utilisateur, le pid et la commande exécutés pour un processus spécifique? (Ubuntu 11.10)

19

Quand je le fais, ps -ef|grep pythonj'obtiens ce qui suit:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

Comment puis-je obtenir uniquement l' utilisateur qui exécute le processus, le pid et la commande exécutés pour le processus comme dans la sortie suivante à la place?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d
Bentley4
la source
Est-ce que ça marche? ps --fields="user pid command"
pratnala
Je ne l'ai pas essayé. Je l'ai trouvé sur le net. Pas près d'une machine Ubuntu maintenant. Pardon. Je verrai plus tard et je vous
ferai
Non, je reçois ERREUR: option gnu long inconnue. Est-ce que ça marche pour toi?
Bentley4

Réponses:

13

Je suppose que vous recherchez l'argument -o:

-o format:

format défini par l'utilisateur. format est un seul argument sous la forme d'une liste séparée par des blancs ou des virgules, qui offre un moyen de spécifier des colonnes de sortie individuelles. Les mots clés reconnus sont décrits dans la section SPECIFICATEURS DE FORMAT STANDARD ci-dessous. Les en-têtes peuvent être renommés (ps -o pid, ruser = RealUser -o comm = Command) comme vous le souhaitez. Si tous les en-têtes de colonne sont vides (ps -o pid = -o comm =), la ligne d'en-tête ne sera pas sortie. La largeur de colonne augmentera au besoin pour les en-têtes larges; cela peut être utilisé pour élargir des colonnes telles que WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Un contrôle de largeur explicite (ps opid, wchan: 42, cmd) est également proposé. Le comportement de ps -o pid = X, comm = Y varie avec la personnalité; la sortie peut être une colonne nommée "X, comm = Y" ou deux colonnes nommées "X" et "Y". Utilisez plusieurs options -o en cas de doute. Utilisez la variable d'environnement PS_FORMAT pour spécifier une valeur par défaut comme vous le souhaitez; DefSysV et DefBSD sont des macros qui peuvent être utilisées pour choisir les colonnes UNIX ou BSD par défaut.

La commande que vous souhaitez serait donc (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

sous OpenSolaris la commande est:

ps -o ruser,pid,comm -ef|grep python
Simon
la source
3
Est-ce que cela fonctionne réellement pour vous? Lorsque Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
j'exécute
Oui, cela fonctionne pour moi dans ksh sous OpenSolaris. La sortie est comme vous le souhaitez ... Consultez les pages de manuel pour ps sur votre système man ps. Peut-être que la syntaxe est légèrement différente sur votre système.
Simon
1
Mais l'OP est sur bash et non sur ksh
pratnala
1
@ Bentley4 Si vous voulez juste la commande et n'avez pas besoin d'informations supplémentaires, vous pouvez supprimer l'argument -f et utiliser la commande suivante:ps -o uid,pid,cmd -e|grep python
Simon
1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon
3

Le plus simple serait probablement:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

De cette façon, vous obtenez tout directement de ps et n'avez pas besoin d'analyser quoi que ce soit.

Depuis la pspage de manuel:

-o format

Format défini par l'utilisateur. format est un seul argument sous la forme d'une liste séparée par des blancs ou des virgules, qui offre un moyen de spécifier des colonnes de sortie individuelles. [...] Les en-têtes peuvent être renommés (ps -o pid, ruser = RealUser -o comm = Command) comme souhaité. Si tous les en-têtes de colonne sont vides (ps -o pid = -o comm =), la ligne d'en-tête ne sera pas sortie.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

L' -Coption fonctionnera si vous exécutez de manière pythoninteractive, pas si python exécute un script. Dans ce cas, vous devez utiliser à la -C scriptname.pyplace.

terdon
la source
1

Ma version de PS est différente, donc elle pourrait nécessiter quelques ajustements, mais vous pouvez utiliser cut (et éventuellement tr en fonction de ce que vous essayez de réaliser) - par exemple quelque chose comme

ps ef | coupe -c1-16,50-   

Fournira les caractères 1-16 et 50 à partir de chaque ligne de votre déclaration ps. (Vos chiffres réels auront probablement besoin d'un peu de massage).

Une autre façon de le faire (mais vous perdrez le formatage) pourrait être

ps ef | tr -s "" | coupe -f1,2,8- -d ""

Ce qui compressera les espaces dans la commande ps, puis prendra les champs 1, 2 et 8 et les affichera.

davidgo
la source
Pour un seul processus, j'obtiens une demi-page d'informations en plein écran avec ces commandes. C'est assez illisible, je «masse» les paramètres mais jusqu'à présent je n'ai rien pu obtenir à distance de ce que je veux.
Bentley4
1
ps -eo user,pid,cmd | grep [p]ython

Exemple:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Explication:

  • -e tous les processus
  • -o format défini par l'utilisateur
  • user,pid,cmd Afficher l'utilisateur, l'ID de processus et les colonnes de commande

Remarque: si vous utilisez -favec -ecomme d'autres l'ont suggéré, vous pouvez obtenir des erreurs. En effet, ces deux paramètres contrôlent le format de sortie et un seul d'entre eux doit être utilisé:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal
bmaupin
la source