Filtern Sie Prozesse nach Name und Nice-Nummer

Filtern Sie Prozesse nach Name und Nice-Nummer

Ich versuche, ein Skript zu erstellen, um die PID-Nummer nur anhand des Prozessnamens und der Nice-Nummer zu finden, aber es gelingt mir nicht.

Antwort1

Verwenden Sie es pgrep, um zuerst die PIDs aller Prozesse abzurufen, die dem als erstes Argument angegebenen Ausdruck entsprechen, und durchlaufen Sie diese dann, um diejenigen zu extrahieren, die einen guten Wert aufweisen, der dem zweiten Argument entspricht.

find_pid_by_name_and_nice () {
    pgrep -- "${1:?missing process name}" |
    xargs -I {} ps -o pid= -o nice= -p {} |
    awk -v nice="${2?missing nice value}" '$NF == nice { print $1 }'
}

Testen:

$ find_pid_by_name_and_nice
find_pid_by_name_and_nice:1: 1: missing process name
find_pid_by_name_and_nice:3: 2: missing nice value
$ find_pid_by_name_and_nice netdata
find_pid_by_name_and_nice:3: 2: missing nice value
$ find_pid_by_name_and_nice netdata 19
258881
258937
$ find_pid_by_name_and_nice netdata 15

(keine Leistung)

Antwort2

by_name_and_nice(){ grep -hoPs "^[^ ]+(?= \($1\)( [^ )]+){16} $2 )" /proc/*/stat; }

by_name_and_nice bash 0findet alle bashProzesse mit der Niceness = 0 (Standard),

by_name_and_nice 'b.*' '.*'findet alle Prozesse, deren Name mit einem beginnt b, unabhängig von ihrer Nettigkeit, und so weiter.

Wenn Sie das oben genannte auch verwenden möchten, um Prozesse mit Zeilenumbrüchen und binärem Müll in ihren Namen zu erhalten, benötigen Sie möglicherweise etwas Komplizierteres:

by_name_and_nice(){
    local -; set -o pipefail
    LC_ALL=C grep -zhoPs "^[^ ]+(?= \($1\)( [^ )]+){16} $2 )" /proc/*/stat | xargs -0rn1
}

Um eine neue Zeile im Prozessnamen abzugleichen, sollten Sie verwenden by_name_and_nice '(?s:foo.*)' 0(lesen Sie mehr über diepcre-Regex-Syntaxwird von der Option von GNU grep verwendet -P).


Dies dient nur zu Demozwecken; es ist ziemlich sinnlos, nach einem netten Wert auszuwählen, ohne einen Größer-als- oder Kleiner-als-Operator. Außerdem ist die Auswahl nach Prozessnamen nicht sehr zuverlässig, da der Prozessname vollständig vom Prozess kontrolliert wird, der von jeder zweitklassigen Malware und Crapware rücksichtslos missbraucht wird, um sich selbst psoder aufzurufen bash. Eine bessere Idee wäre, nach dem Basisnamen der Binärdatei auszuwählen, wie in

find /proc/*/exe -lname '*/whatever'

Die Entwicklung all dessen bleibt dem Leser als Übung überlassen ;-)

Antwort3

POSIX, mit psund awk:

by_name_and_nice() {
  # returns pids of processes with $2 as niceness and whose
  # process name matches the $1 extended regexp
  ps -A -o pid= -o nice= -o comm= |
    NAME=$1 NICE=$2 awk '
      $2 == ENVIRON["NICE"] {
        pid = $1
        sub(/^[[:space:]]*[^[:space:]]+ +[^[:space:]]+ /, "")
        if ($0 ~ ENVIRON["NAME"]) print pid
      }'
}

Dies setzt voraus, dass zwischen der Niceness-Spalte und dem Prozessnamen ein einzelnes Leerzeichen steht. Dies ist bei der procps-ng-Implementierung, wie sie typischerweise auf Linux-basierten Systemen zu finden ist, der Fall, wird aber von POSIX nicht garantiert. Sie könnten alle Leerzeichen nach der Niceness-Spalte entfernen, aber das birgt das Risiko, Prozesse, deren Name mit einem Leerzeichen beginnt, falsch darzustellen.

Beachten Sie, dass procps-ng psnicht druckbare Zeichen in der Ausgabe zumindest in ändert ?und dass das, was ein nicht druckbares Zeichen ist, vom Gebietsschema des Aufrufers von abhängt ps. Beispielsweise Stéphanekönnte ein Prozess mit UTF-8 als Name so dargestellt werden, als St??phaneob das Gebietsschema einen anderen Zeichensatz als UTF-8 verwendet.

Die procps-ngImplementierungen von psunterstützen -Cjedoch eine Option zum Abgleichen von Prozessen nach Namen (inspiriert von HP/UX‘ ps), obwohl dies ein exakter Byte-für-Byte-Gleichheitsabgleich und kein Abgleich mit regulären Ausdrücken ist. Sie könnten also Folgendes tun:

by_name_and_nice() {
  # returns pids of processes with $2 as niceness and whose
  # process name is exactly $1
  ps -C "$1" -o pid= -o nice= |
    awk -v nice="$2" '$2 == nice {print $1}'
}

verwandte Informationen