Ausführen von ps mit Klauseln als AND statt OR

Ausführen von ps mit Klauseln als AND statt OR

Ich möchte sehen, ob ein bestimmter Prozess als bestimmter Benutzer ausgeführt wird. Dafür kann ich Folgendes tun:

ps --no-headers -C command -o user | grep user

Das ist ganz praktisch, wird jedoch etwas hässlich, wenn ich anschließend die Argumente ausdrucken möchte (was mit dem grep für den Benutzernamen in Konflikt geraten kann!).

ps --no-headers -C command -o user,pid,comm | egrep \^user

Das würde noch schlimmer werden, wenn ich den Benutzer nicht als erste oder letzte Spalte haben wollte. Was noch schöner wäre, wäre, wenn ich die Optionen -C und -U in PS wie folgt angeben könnte

ps --no-headers -C command -U user -o pid

Dies funktioniert jedoch nicht, da die beiden Klauseln als ODERs und nicht als UNDs fungieren. Gibt es eine Funktion von „ps“, die ich übersehe, oder vielleicht einen anderen netten Einzeiler, den ich verwenden könnte? Prost!

Antwort1

pgrepunterstützt verschiedene Bedingungen:

pgrep -x -u "user" "command"

Ersetzen Sie es -xdurch -f, damit auch die Argumente übereinstimmen; fügen Sie es -lzur Anzeige der Befehlszeile hinzu.

Sie können die Befehlszeile auch direkt auslesen (null-getrennt):/proc/PID/cmdline

if pids=$(pgrep -x -u "user" "command"); then
    for pid in $pids; do
        tr "\0" " " < /proc/$pid/cmdline; echo
    done
fi

verwandte Informationen