796 Stimmen

Mit Bash und Regex einen Prozess in einer Zeile finden und beenden

Ich muss oft einen Prozess während der Programmierung beenden.

Ich mache es jetzt so:

[~]$ ps aux | grep 'python csp_build.py'
user    5124  1.0  0.3 214588 13852 pts/4    Sl+  11:19   0:00 python csp_build.py
user    5373  0.0  0.0   8096   960 pts/6    S+   11:20   0:00 grep python csp_build.py
[~]$ kill 5124

Wie kann ich die Prozess-ID automatisch extrahieren und sie in derselben Zeile beenden?

Zum Beispiel so:

[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>

3 Stimmen

Glauben Sie mir! :'D Die erste Antwort, die Sie gewählt haben, ist viel komplexer als die Lösung, die Sie in Ihrer Antwort angegeben haben. Ich würde lieber deinen Weg wählen.

0 Stimmen

Die beste Möglichkeit zu prüfen, ob ein Prozess existiert: stackoverflow.com/questions/3043978/

1707voto

paxdiablo Punkte 809679

Unter bash sollten Sie in der Lage sein zu tun:

kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')

Einzelheiten zu seiner Funktionsweise sind wie folgt:

  • El ps erhalten Sie die Liste aller Prozesse.
  • El grep filtert diese auf der Grundlage Ihres Suchbegriffs, [p] ist ein Trick, um zu verhindern, dass Sie die eigentliche grep Prozess selbst.
  • El awk gibt Ihnen nur das zweite Feld jeder Zeile an, das die PID ist.
  • El $(x) konstruieren bedeutet ausführen x und geben Sie dessen Ausgabe in die Befehlszeile ein. Die Ausgabe dieser ps Pipeline innerhalb des obigen Konstrukts ist die Liste der Prozess-IDs, so dass Sie am Ende einen Befehl erhalten wie kill 1234 1122 7654 .

Hier ist eine Abschrift, die es in Aktion zeigt:

pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+  Terminated              sleep 3600
[1]   Terminated              sleep 3600
[2]   Terminated              sleep 3600
[3]-  Terminated              sleep 3600
[4]+  Terminated              sleep 3600

und Sie können sehen, wie sie alle Schwellen abschließt.


Erläuterung der grep '[p]ython csp_build.py' ein bisschen ausführlicher:

Wenn Sie das tun sleep 3600 & gefolgt von ps -ef | grep sleep erhalten Sie in der Regel zwei Prozesse mit sleep darin, die sleep 3600 und die grep sleep (denn beide haben sleep in ihnen, das ist keine Raketenwissenschaft).

Allerdings, ps -ef | grep '[s]leep' erzeugt keinen Prozess mit sleep in ihr, sondern erstellt stattdessen grep '[s]leep' und hier ist der Knackpunkt: die grep findet es nicht, weil es nach dem regulären Ausdruck "any character from the character class" sucht [s] (das ist s ), gefolgt von leep .

Mit anderen Worten, es wird gesucht nach sleep aber der grep-Prozess ist grep '[s]leep' die nicht über sleep darin.

Als mir dies (von jemandem hier auf SO) gezeigt wurde, habe ich sofort damit angefangen, weil

  • es ist ein Prozess weniger als das Hinzufügen von | grep -v grep und
  • es ist elegant y heimtückisch, eine seltene Kombination :-)

184voto

ghostdog74 Punkte 305138

Wenn Sie pkill haben,

pkill -f csp_build.py

Wenn Sie nur den Prozessnamen durchsuchen wollen (statt der gesamten Argumentliste), dann lassen Sie -f .

121voto

a20 Punkte 4691

One liner:

ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9

  • Drucken Sie Spalte 2 aus: awk '{print $2}'
  • sudo ist freigestellt
  • ausführen. kill -9 5124 , kill -9 5373 usw. (kill -15 ist anmutiger, aber etwas langsamer)

Bonus:

Ich habe auch 2 Abkürzungsfunktionen in meinem .bash_profile definiert (~/.bash_profile ist für OSX, Sie müssen sehen, was für Ihren *nix-Rechner funktioniert).

  1. p Stichwort
    • listet alle P Prozesse mit Schlüsselwort
    • Verwendung z.B: p csp_build , p python usw.

bash_profile Code:

# FIND PROCESS
function p(){
        ps aux | grep -i $1 | grep -v grep
}
  1. ka Stichwort
    • K Krankheiten A alle Prozesse, die dieses Schlüsselwort haben
    • Verwendung z.B: ka csp_build , ka python usw.
    • optionale Tötungsstufe z.B: ka csp_build 15 , ka python 9

bash_profile Code:

# KILL ALL
function ka(){

    cnt=$( p $1 | wc -l)  # total count of processes found
    klevel=${2:-15}       # kill level, defaults to 15 if argument 2 is empty

    echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
    p $1

    echo -e '\nTerminating' $cnt 'processes .. '

    ps aux  |  grep -i $1 |  grep -v grep   | awk '{print $2}' | xargs sudo kill -klevel
    echo -e "Done!\n"

    echo "Running search again:"
    p "$1"
    echo -e "\n"
}

24voto

Miron Yanovskiy Punkte 600
killall -r regexp

-r, --regexp

Interpretiert Prozessnamensmuster als erweiterten regulären Ausdruck.

20voto

Rakib Fiha Punkte 423

Es wird nur die pid zurückgegeben

pgrep -f 'process_name'

Um also einen Prozess in einer Zeile zu beenden:

kill -9 $(pgrep -f 'process_name')

oder, wenn Sie den genauen Namen des Prozesses kennen, können Sie auch pidof versuchen:

kill -9 $(pidof 'process_name')

Aber wenn Sie den genauen Namen des Prozesses nicht kennen, pgrep wäre besser.

Wenn mehrere Prozesse mit demselben Namen laufen und Sie den ersten beenden wollen, dann:

kill -9 $(pgrep -f 'process_name' | head -1)

Wenn Sie sich Sorgen um die Groß- und Kleinschreibung machen, können Sie auch die Option -i hinzufügen, genau wie bei grep. Zum Beispiel:

kill -9 $(pgrep -fi chrome)

Weitere Informationen über Signale und pgrep unter man 7 signal o man signal y man pgrep

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X