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
pgrep
unterstützt verschiedene Bedingungen:
pgrep -x -u "user" "command"
Ersetzen Sie es -x
durch -f
, damit auch die Argumente übereinstimmen; fügen Sie es -l
zur 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