Wie kann ich erreichen, dass nur der Benutzer, die PID und der Befehl für einen bestimmten Prozess ausgeführt werden? (Ubuntu 11.10)

19

Wenn ich das tue, ps -ef|grep pythonbekomme ich Folgendes:

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

Wie erhalte ich stattdessen nur den Benutzer , der den Prozess ausführt , die pid und den Befehl , der für den Prozess ausgeführt wird, wie in der folgenden Ausgabe?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d
Bentley4
quelle
Funktioniert das? ps --fields="user pid command"
Pratnala
Habe es nicht ausprobiert Fand es im Netz. Jetzt nicht in der Nähe einer Ubuntu-Maschine. Es tut uns leid.
Wir
Nein, ich bekomme FEHLER: Unbekannte Gnu lange Option. Funktioniert es bei dir
Bentley4

Antworten:

13

Ich vermute, Sie suchen nach dem Argument -o:

-o Format:

benutzerdefiniertes Format. format ist ein einzelnes Argument in Form einer durch Leerzeichen oder Kommas getrennten Liste, mit der einzelne Ausgabespalten angegeben werden können. Die erkannten Schlüsselwörter werden im folgenden Abschnitt STANDARDFORMAT-SPEZIFIKATOREN beschrieben. Header können nach Wunsch umbenannt werden (ps -o pid, ruser = RealUser -o comm = Command). Wenn alle Spaltenüberschriften leer sind (ps -o pid = -o comm =), wird die Kopfzeile nicht ausgegeben. Die Spaltenbreite erhöht sich je nach Bedarf für breite Überschriften. Dies kann verwendet werden, um Spalten wie WCHAN zu erweitern (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Eine explizite Breitensteuerung (ps opid, wchan: 42, cmd) wird ebenfalls angeboten. Das Verhalten von ps -o pid = X, comm = Y variiert mit der Persönlichkeit; Die Ausgabe kann eine Spalte mit dem Namen "X, comm = Y" oder zwei Spalten mit dem Namen "X" und "Y" sein. Verwenden Sie im Zweifelsfall mehrere -o-Optionen. Verwenden Sie die Umgebungsvariable PS_FORMAT, um einen gewünschten Standard festzulegen. DefSysV und DefBSD sind Makros, mit denen die standardmäßigen UNIX- oder BSD-Spalten ausgewählt werden können.

Der von Ihnen gewünschte Befehl wäre (Ubuntu):

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

unter OpenSolaris lautet der Befehl:

ps -o ruser,pid,comm -ef|grep python
Simon
quelle
3
Funktioniert das eigentlich bei dir? Wenn ich diesen Befehl ausführe, Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
erhalte
Ja, es funktioniert bei mir in ksh unter OpenSolaris. Die Ausgabe erfolgt nach Ihren Wünschen ... Überprüfen Sie die Manpages auf ps auf Ihrem System man ps. Möglicherweise unterscheidet sich die Syntax auf Ihrem System geringfügig.
Simon
1
Aber die OP ist auf Bash und nicht auf
Ksh
1
@ Bentley4 Wenn Sie nur den Befehl benötigen und keine zusätzlichen Informationen benötigen, können Sie das Argument -f löschen und den folgenden Befehl verwenden:ps -o uid,pid,cmd -e|grep python
Simon
1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon
3

Das einfachste wäre wahrscheinlich:

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

Auf diese Weise erhalten Sie alles direkt von psund müssen nichts analysieren.

Von der psManpage:

-o Format

Benutzerdefiniertes Format. format ist ein einzelnes Argument in Form einer durch Leerzeichen oder Kommas getrennten Liste, mit der einzelne Ausgabespalten angegeben werden können. [...] Header können wie gewünscht umbenannt werden (ps -o pid, ruser = RealUser -o comm = Command). Wenn alle Spaltenüberschriften leer sind (ps -o pid = -o comm =), wird die Kopfzeile nicht ausgegeben.

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

Die -COption funktioniert, wenn Sie pythoninteraktiv ausgeführt werden, nicht, wenn in Python ein Skript ausgeführt wird. In diesem Fall sollten Sie -C scriptname.pystattdessen verwenden.

terdon
quelle
1

Meine PS-Version ist anders, daher ist möglicherweise eine Feinabstimmung erforderlich, aber Sie können cut verwenden (und möglicherweise tr, je nachdem, was Sie erreichen möchten) - zum Beispiel so etwas wie

ps ef | Schnitt -c1-16,50-   

Gibt die Zeichen 1-16 und 50 ab jeder Zeile Ihrer ps-Anweisung an. (Ihre tatsächlichen Zahlen müssen wahrscheinlich ein wenig massiert werden).

Ein anderer Weg, es zu tun (aber Sie werden die Formatierung verlieren) könnte sein

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

Dadurch wird das Leerzeichen im Befehl ps komprimiert, und die Felder 1,2 und 8 werden angezeigt.

Davidgo
quelle
Für nur einen Vorgang erhalte ich mit diesen Befehlen eine halbe Seite mit Informationen im Vollbildmodus. Es ist ziemlich unlesbar, ich "massiere" die Parameter, aber bis jetzt konnte ich nichts von dem bekommen, was ich will.
Bentley4
1
ps -eo user,pid,cmd | grep [p]ython

Beispiel:

$ 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

Erläuterung:

  • -e alle Prozesse
  • -o benutzerdefiniertes Format
  • user,pid,cmd Anzeigen von Benutzer-, Prozess-ID- und Befehlsspalten

Hinweis: Wenn Sie verwenden -fmit -ewie andere vorgeschlagen haben, können Sie Fehlermeldungen erhalten. Dies liegt daran, dass diese beiden Parameter das Ausgabeformat steuern und nur einer von ihnen verwendet werden sollte:

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