it-swarm.com.de

Suchen und beenden Sie einen Prozess in einer Zeile mit bash und regex

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

So mache ich es jetzt:

[~]$ 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 in derselben Zeile beenden?

So was:

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

In bash sollten Sie in der Lage sein:

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

Details zu seiner Funktionsweise sind wie folgt:

  • Die ps gibt Ihnen die Liste aller Prozesse.
  • Das grep filtert, dass [p] basierend auf Ihrer Suchzeichenfolge ein Trick ist, um zu verhindern, dass Sie den tatsächlichen grep -Prozess selbst abrufen.
  • Das awk gibt Ihnen nur das zweite Feld jeder Zeile, nämlich die PID.
  • Das Konstrukt $(x) bedeutet, x auszuführen, dann die Ausgabe zu übernehmen und in die Befehlszeile einzufügen. Die Ausgabe dieser ps -Pipeline in diesem Konstrukt oben ist die Liste der Prozess-IDs, sodass Sie einen Befehl wie kill 1234 1122 7654 erhalten.

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, dass es alle Schwellen beendet.


Erkläre den grep '[p]ython csp_build.py' ein bisschen genauer:

Wenn Sie sleep 3600 & gefolgt von ps -ef | grep sleep ausführen, erhalten Sie in der Regel zwei Prozesse mit sleep, dem sleep 3600 und dem grep sleep (weil sie beide sleep in sich haben, ist das keine Raketenwissenschaft).

ps -ef | grep '[s]leep' erstellt jedoch keinen Prozess mit sleep, sondern erstellt grep '[s]leep' und hier ist das schwierige Bit: Der grep findet ihn nicht, weil er aussieht für den regulären Ausdruck "ein beliebiges Zeichen aus der Zeichenklasse [s] (das s ist), gefolgt von leep.

Mit anderen Worten, es sucht nach sleep, aber der Grep-Prozess ist grep '[s]leep', der nicht sleep enthält.

Als mir dies gezeigt wurde (von jemandem hier auf SO), fing ich sofort an, es zu benutzen, weil

  • es ist ein Prozess weniger als das Hinzufügen von | grep -v grep; und
  • es ist elegant nd hinterhältig, eine seltene Kombination :-)
1270
paxdiablo

wenn du pkill hast,

pkill -f csp_build.py

Wenn Sie nur gegen den Prozessnamen (anstelle der vollständigen Argumentliste) springen möchten, lassen Sie -f weg.

122
ghostdog74

Einzeiler:

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

  • Drucke Spalte 2 aus: _awk '{print $2}'_
  • Sudo ist optional
  • Führen Sie _kill -9 5124_, _kill -9 5373_ usw. aus (kill -15 ist eleganter, aber etwas langsamer).

Bonus:

Ich habe auch 2 Verknüpfungsfunktionen in meinem .bash_profile definiert (~/.bash_profile ist für osx, Sie müssen sehen, was für Ihre * nix-Maschine funktioniert).

  1. p Schlüsselwort
    • listet alle P Prozesse auf, die ein Schlüsselwort enthalten
    • 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 Schlüsselwort
    • K ills A ll Prozesse, die dieses Schlüsselwort haben
    • verwendung z. B .: _ka csp_build_, _ka python_ usw
    • optionales Kill-Level, 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"
}
_
79
a20

Versuchen Sie es mit

ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
14
Rahul
killall -r regexp

-r, --regexp

Interpretieren Sie das Prozessnamenmuster als erweiterten regulären Ausdruck.

13
Miron Yanovskiy

Sie dürfen nur pkill '^python*' für das Beenden von Regex-Prozessen verwenden.

Wenn du sehen willst, was du töten oder finden wirst, bevor du tötest, benutze einfach pgrep -l '^python*', wobei -l auch den Namen des Prozesses ausgibt. Wenn Sie pkill nicht verwenden möchten, verwenden Sie einfach:

pgrep '^python*' | xargs kill

9
NGix

Verwenden Sie pgrep - verfügbar auf vielen Plattformen:

kill -9 `pgrep -f cps_build`

pgrep -f gibt alle PIDs zufällig "cps_build" zurück

6
vr286

So beenden Sie den Prozess mit dem Schlüsselwort midori, zum Beispiel:

kill -SIGTERM $(pgrep -i midori)

5
l3v1ath4n

sie können es mit awk und backtics tun

ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`

$ 2 in awk gibt Spalte 2 aus, und das Backtics führt die Anweisung aus, die gedruckt wird.

Eine viel sauberere Lösung wäre jedoch, dass der python -Prozess seine Prozess-ID in/var/run speichert. Dann können Sie diese Datei einfach lesen und abbrechen.

5

Meine Aufgabe war es, alle passenden regulären Ausdrücke zu töten, die in einem bestimmten Verzeichnis abgelegt sind (nach Selenium-Tests wurde nicht alles gestoppt). Das hat bei mir funktioniert:

for i in `ps aux | egrep "firefox|chrome|Selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done
5
Serge

Dies gibt nur die pid zurück

pgrep -f 'process_name'

So beenden Sie einen Prozess in einer Zeile:

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

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

kill -9 $(pidof 'process_name')

Wenn Sie jedoch den genauen Namen des Prozesses nicht kennen, ist pgrep besser.

Wenn mehrere Prozesse mit demselben Namen ausgeführt werden und Sie den ersten beenden möchten, gehen Sie wie folgt vor:

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

Beachten Sie auch, dass Sie, wenn Sie sich Sorgen um die Groß-/Kleinschreibung machen, die Option -i wie in grep hinzufügen können. Zum Beispiel:

kill -9 $(pgrep -fi chrome)

Weitere Informationen zu Signalen und pgrep unter man 7 signal oder man signal und man pgrep

4
Rakib Fiha

Eine Methode, die nur awk (und ps) verwendet:

ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'

Durch die Verwendung von String-Gleichheitstests verhindere ich, dass dieser Prozess selbst abgeglichen wird.

3
schot

Gib -f zu pkill

pkill -f /usr/local/bin/fritzcap.py

der genaue Pfad der .py-Datei lautet

# ps ax | grep fritzcap.py
 3076 pts/1    Sl     0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
3
Robert1968
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
3
Vijay

Ich habe angefangen, so etwas zu benutzen:

kill $(pgrep 'python csp_build.py')
2
Nathanael

In einigen Fällen möchte ich Prozesse auf folgende Weise gleichzeitig beenden:

~ Schlaf 1000 & 
 [1] 25410 
 ~ Schlaf 1000 & 
 [2] 25415 
 ~ Schlaf 1000 & 
 [3 ] 25421 
 ~ Pidof sleep 
 25421 25415 25410 
 ~ Kill `pidof sleep` 
 [2] - 25415 terminated sleep 1000 
 [ 1] - 25410 beendet Schlaf 1000 
 [3] + 25421 beendet Schlaf 1000

Aber ich denke, es ist ein bisschen unangemessen in Ihrem Fall. (Möglicherweise laufen dort python a, python b, python x ... in der Hintergrund.)

1
kashu.org

Töte unsere eigenen Prozesse, die mit einem allgemeinen PPID begonnen wurden, ist ziemlich häufig, pkill, das mit der –P -Flag verbunden ist, ist ein Gewinner für mich. Beispiel mit @ ghostdog74:

# sleep 30 &                                                                                                      
[1] 68849
# sleep 30 &
[2] 68879
# sleep 30 &
[3] 68897
# sleep 30 &
[4] 68900
# pkill -P $$                                                                                                         
[1]   Terminated              sleep 30
[2]   Terminated              sleep 30
[3]-  Terminated              sleep 30
[4]+  Terminated              sleep 30
1

Sie brauchen den Benutzer-Schalter nicht für ps.

kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
1
Alex V

Ich benutze gkill processname, wobei gkill das folgende Skript ist:

cnt=`ps aux|grep $1| grep -v "grep" -c`
if [ "$cnt" -gt 0 ]
then
    echo "Found $cnt processes - killing them"
    ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill
else
    echo "No processes found"
fi

HINWEIS: Es werden KEINE Prozesse abgebrochen, deren Befehlszeile "grep" enthält.

0
Kostyantyn

Ich benutze dies, um Firefox zu töten, wenn das Skript zugeschlagen und die CPU zerschlagen wird :) Ersetze 'Firefox' durch die App, die du sterben möchtest. Ich bin auf der Bash Shell - OS X 10.9.3 Darwin.

kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)

0
mrhassell