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 in derselben Zeile beenden?
So was:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
Antworten:
In
bash
sollten Sie in der Lage sein:Details zu seiner Arbeitsweise sind wie folgt:
ps
gibt Ihnen die Liste aller Prozesse.grep
Filter, die auf Ihrer Suchzeichenfolge basieren,[p]
sind ein Trick, um zu verhindern, dass Sie den eigentlichengrep
Prozess selbst erfassen.awk
gibt Ihnen nur das zweite Feld jeder Zeile, das die PID ist.$(x)
Konstrukt bedeutet ausführen,x
dann seine Ausgabe nehmen und in die Befehlszeile einfügen. Die Ausgabe dieserps
Pipeline in diesem Konstrukt oben ist die Liste der Prozess-IDs, sodass Sie am Ende einen Befehl wie erhaltenkill 1234 1122 7654
.Hier ist ein Transkript, das es in Aktion zeigt:
und Sie können sehen, dass es alle Schläfer beendet.
Das
grep '[p]ython csp_build.py'
Bit etwas ausführlicher erklären :Wenn Sie
sleep 3600 &
gefolgt sindps -ef | grep sleep
, neigen Sie dazu, zwei Prozessesleep
darin zu haben, densleep 3600
und dengrep sleep
(weil beidesleep
in ihnen sind, ist das keine Raketenwissenschaft).Es
ps -ef | grep '[s]leep'
wird jedoch kein Prozesssleep
darin erstellt, sondern es wird erstellt,grep '[s]leep'
und hier ist das Knifflige: Dasgrep
findet es nicht, weil es nach dem regulären Ausdruck "jedes Zeichen aus der Zeichenklasse[s]
(das folgts
) " suchtleep
.Mit anderen Worten, es wird gesucht,
sleep
aber der Grep-Prozess ist derjenige,grep '[s]leep'
der nichtsleep
darin enthalten ist.Als mir dies gezeigt wurde (von jemandem hier auf SO), fing ich sofort an, es zu benutzen, weil
| grep -v grep
. undquelle
kill
mit der Standardausgabe ausgegebenkill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
grep '[p]ython csp_build.py'
Sie auch verwenden :kill $(ps aux | grep 'python csp_build.py' | grep -v grep | awk '{print $2}')
.grep -v
Gibt nicht übereinstimmende Zeilen zurück.wenn du pkill hast,
Wenn Sie nur nach dem Prozessnamen (anstelle der vollständigen Argumentliste) suchen möchten, lassen Sie es aus
-f
.quelle
pgrep
undpkill
arbeiten Sie so lange, wie Sie darauf achten, den Prozess korrekt anzugeben. Standardmäßig wird nur der Prozessname abgeglichen, was in diesem Fall mit ziemlicher Sicherheit nur "Python" ist. Verwenden Siepgrep -f "python csp_build.py"
diese Option , um den vollständigen Befehl abzugleichen.pkill -9 -f csp_build.py
Einzeiler:
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
es ist optionalkill -9 5124
,kill -9 5373
etc (kill -15 ist anmutiger , 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).
p csp_build
,p python
usw.bash_profile code:
ka csp_build
,ka python
usw.ka csp_build 15
,ka python 9
bash_profile code:
quelle
source ~/.bash_profile
in der aktuellen Shell ausführen , um die neuen Funktionen zu importieren (das ist, was ich bevorzuge).grep
. Denken Sie daran, alles, was aussieht,grep x | awk '{ y }'
ist normalerweise besser und oft robuster, wenn Sie es durchawk '/x/ { y }'
Interpretieren Sie das Prozessnamenmuster als erweiterten regulären Ausdruck.
quelle
Versuchen Sie es mit
quelle
ps aux | grep 'python csp_build.py' | awk '{print $2}' | xargs kill
arbeitete für mich. Dankegrep
, und das meiste einfach und elegant. Der triviale Fall vongrep x y | awk '{ z }'
ist immer besser geschriebenawk '/x/ { z }' y
- siehe auch nutzlose Verwendung vongrep
.Sie dürfen nur verwenden
pkill '^python*'
für das Töten von Regex-Prozessen verwenden.Wenn Sie sehen möchten, was Sie töten oder finden werden, bevor Sie töten, verwenden Sie einfach,
pgrep -l '^python*'
wobei -l auch den Namen des Prozesses ausgibt. Wenn Sie nicht verwenden möchtenpkill
, verwenden Sie einfach:pgrep '^python*' | xargs kill
quelle
Verwenden Sie pgrep - verfügbar auf vielen Plattformen:
pgrep -f gibt alle PIDs mit dem Zufall "cps_build" zurück.
quelle
pgrep
, werden Sie auch habenpkill
. Verwendenkill -9
Sie es wie immer nur, wenn Sie wissen, warumkill -15
(Standardeinstellung) oderkill -2
nicht.-9
und die richtige moderne Syntax für die Substitution von Befehlen verwendet wird. Stimmen Sie das stattdessen zu; Diepkill
Antwort ist natürlich noch besser.-9
eigentlich bedeutet.Dies gibt nur die PID zurück
So beenden Sie jeden Prozess in einer Zeile:
Wenn Sie den genauen Namen des Prozesses kennen, können Sie auch pidof ausprobieren:
Wenn Sie jedoch den genauen Namen des Prozesses nicht kennen,
pgrep
dies besser.Wenn mehrere Prozesse mit demselben Namen ausgeführt werden und Sie den ersten beenden möchten, gehen Sie wie folgt vor:
Beachten Sie auch, dass Sie die Option -i wie in grep hinzufügen können, wenn Sie sich Sorgen über die Groß- und Kleinschreibung machen. Zum Beispiel:
Weitere Infos zu Signalen und pgrep unter
man 7 signal
oderman signal
undman pgrep
quelle
Sie können es mit awk und backtics tun
$ 2 in awk druckt Spalte 2 und das Backtics führt die gedruckte Anweisung aus.
Eine viel sauberere Lösung wäre jedoch, dass der Python-Prozess seine Prozess-ID in / var / run speichert und Sie diese Datei dann einfach lesen und beenden können.
quelle
Meine Aufgabe war es, alles zu töten, was mit regulärem Ausdruck übereinstimmt, der sich in einem bestimmten Verzeichnis befindet (nach Selentests wurde nicht alles gestoppt). Das hat bei mir funktioniert:
quelle
-9
Optionkill
ist vielleicht zu aggressiv. Es erlaubt ihnen nicht, ihre Ressourcen freizugeben.kill
Akzeptiert mehrere Prozesse, sodass die Schleife grundsätzlich unbrauchbar ist. und wie an anderer Stelle auf dieser Seite erwähnt, sollten Sie nicht verwenden, eskill -9
sei denn, Sie wissen, dass der Prozess nicht nur darauf reagiertkill
.So beenden Sie den Prozess anhand eines Schlüsselworts
midori
:kill -SIGTERM $(pgrep -i midori)
quelle
Eine Methode, die nur
awk
(undps
) verwendet:Durch die Verwendung von String-Gleichheitstests verhindere ich, dass dieser Prozess selbst abgeglichen wird.
quelle
quelle
ps
mit-o
Option lohnt sich.Gib -f zu pkill
Der genaue Pfad der .py-Datei ist
quelle
Ich fing an, so etwas zu benutzen:
quelle
Das Töten unserer eigenen Prozesse, die von einer gemeinsamen PPID aus gestartet wurden, ist ziemlich häufig. Der mit der
–P
Flagge verbundene Pkill ist für mich ein Gewinner. Beispiel: Verwenden von @ ghostdog74:quelle
Sie brauchen den Benutzerschalter nicht für ps.
quelle
In einigen Fällen möchte ich Prozesse gleichzeitig wie folgt beenden:
Aber ich denke, es ist in Ihrem Fall ein wenig unangemessen. (Möglicherweise laufen Python a, Python b, Python x ... im Hintergrund.)
quelle
Wenn
pkill -f csp_build.py
der Prozess-9
nicht abgebrochen wird, können Sie hinzufügen , um ein Kill-Signal zu senden, das nicht ignoriert wird. dhpkill -9 -f csp_build.py
quelle
Die Lösung wäre, die Prozesse mit genauem Muster zu filtern, die PID zu analysieren und eine Argumentliste für die Ausführung von Kill-Prozessen zu erstellen:
Erklärung aus der Dokumentation:
Beispiel :
quelle
Ich benutze dies, um Firefox zu töten, wenn das Skript zugeschlagen wird und die CPU aufgeschlagen wird :) Ersetzen Sie 'Firefox' durch die App, die Sie sterben möchten. 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)
quelle
grep Firefox | awk 'NR == 1 { next } ...'
durchawk 'NR == 1 || $11 !~ /Firefox/ { next } ...'
spart nicht nur einen Prozess, sondern verbessert auch die Präzision. Es ist nicht schwer , um loszuwerden,sort | uniq
in reinem Awk entweder (während natürlichuniq | sort
nur falsch ist - es Duplikate verpassen , die nicht benachbart sind, und versteckt die Fehler durch unnötig die Sortier Ausgabe vonuniq
).Ich benutze
gkill processname
, wobei gkill das folgende Skript ist:HINWEIS: Prozesse, deren Befehlszeilen "grep" enthalten, werden NICHT beendet.
quelle
grep
und anderen gängigen Antimustern für Shell-Skripte durchsetzt.Der folgende Befehl ist praktisch:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
z.B.,
ps -elf | grep top
kill -$(ps -elf | grep top| awk {'print $4'})
Wenn der Prozess immer noch nicht funktioniert, verwenden Sie die Erweiterung "-9", um Hardkill wie folgt auszuführen:
kill -9 $(ps -elf | grep top| awk {'print $4'})
Ich hoffe, das hilft...!
quelle
Finde und töte alle Prozesse in einer Zeile in Bash.
ps -ef | grep '<exe_name>'
- Gibt die Liste der laufenden Prozessdetails (uname, pid usw.) an, die dem Muster entsprechen. Die Ausgabeliste enthält diesengrep
Befehl auch, der ihn durchsucht. Zum Töten müssen wir diesengrep
Befehlsprozess ignorieren .ps -ef | grep '<exec_name>' | grep -v 'grep'
- Durch Hinzufügen eines weiteren Grep mit-v 'grep'
wird der aktuelle Grep-Prozess entfernt.awk
Sie dann nur die Prozess-ID.$(...)
und übergeben Sie ihn an denkill
Befehl, um alle Prozesse abzubrechen.quelle
Sie können den folgenden Befehl verwenden, um die PID des Befehls aufzulisten. Verwenden Sie top oder besser htop, um alle Prozesse unter Linux anzuzeigen. Hier möchte ich einen Prozess namens beenden
Und überprüfen Sie die PID. Es muss richtig sein. Um sie zu töten, benutze den Befehl kill.
ZB: - stammt aus der htop-Prozessliste.
Dies löst meine Probleme. Seien Sie immer bereit, den Prozess neu zu starten, wenn Sie versehentlich einen Prozess beenden.
quelle