Gibt es eine Möglichkeit, durch mehrere Bedingungen in "ps" auszuwählen?

12

Es scheint, als würde mir etwas blendend Offensichtliches fehlen, aber dennoch:

ps -f -u myuser --ppid 1

Scheint nur einen Blick auf die übergeordnete PID des Prozesses zu werfen und gibt alle Prozesse zurück, die die übergeordnete PID von 1 haben - auch wenn der Benutzer dies nicht ist myuser.

Das -ualleine funktioniert richtig (nur Prozesse auswählen von myuser):

ps -f -u myuser

Was vermisse ich? Gibt es eine integrierte Möglichkeit, nach verschiedenen Bedingungen zu filtern ps?

EDIT: Meine aktuelle Problemumgehung:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))
Rogach
quelle

Antworten:

12

psist so nervig. Glücklicherweise gibt es pgrepsolche, die ähnliche Auswahloptionen haben, für die jedoch alle übereinstimmen müssen, und die dann die passenden Pids ausgeben. Standardmäßig wird eine pro Zeile ausgegeben, es kann jedoch aufgefordert werden, ein anderes Trennzeichen zu verwenden, damit Folgendes funktioniert ps:

ps -f -p"$(pgrep -d, -u $USER -P 1)"
Rici
quelle
4

Leider pskann nur die Auswahl aufgehoben werden, es scheint weder einen andOperator noch die Möglichkeit zu geben, Verfeinerungen hinzuzufügen.

Sie können die Hilfe von pgrepin Anspruch nehmen, um eine Liste der PIDs zu erhalten und diese psjedoch einzugeben . Beispielsweise:

$ ps -f $(pgrep -P 1 -u saml)
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
saml      1986     1  0 Jul25 ?        SLl    0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
saml      2003     1  0 Jul25 ?        S      0:00 dbus-launch --sh-syntax --exit-with-session
saml      2004     1  0 Jul25 ?        Ss     0:23 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
saml      2147     1  0 Jul25 ?        S      0:04 /usr/libexec/gconfd-2
saml      2156     1  0 Jul25 ?        Ssl    0:09 /usr/libexec/gnome-settings-daemon
saml      2162     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfsd
saml      2178     1  0 Jul25 ?        Ssl    0:01 /usr/bin/pulseaudio --start --log-target=syslog
saml      2180     1  0 Jul25 ?        Ssl    0:04 /usr/libexec//gvfs-fuse-daemon /home/saml/.gvfs
saml      2191     1  0 Jul25 ?        S      0:12 syndaemon -i 0.5 -k
saml      2193     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfs-gdu-volume-monitor
slm
quelle
2

pshat keine sehr flexiblen Filter. Stellen Sie sicher, dass mehr angezeigt wird, als Sie benötigen, geben Sie das Format explizit an und filtern Sie die Ausgabe. Awk funktioniert oft gut für diese Aufgabe.

ps -o pid= -o ppid= -o user= -o comm= -o args= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid'

Die Gleichheitszeichen nach den Spaltennamen unterdrücken die Kopfzeile. Wenn Sie die Kopfzeilen sehen möchten, lassen Sie den Filter die erste Zeile unverändert ausdrucken:

ps -o pid -o ppid -o user -o comm -o args |
awk -v uid="$(id -un myuser)" 'NR == 1 || ($2 == 1 && $3 == uid)'

Wenn Sie eine automatisierte Verarbeitung durchführen möchten, müssen Sie die Daten nur auf die PIDs reduzieren.

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'
Gilles 'SO - hör auf böse zu sein'
quelle
0

Ich musste nach PIDs suchen, die von meinem Stapel gestartet wurden, also musste ich nach einer PID und einer PPID suchen. Dieser Grep war für mich nützlicher:

grep -c $$ /proc/CHILDPID/stat
Ragnarok
quelle