Ich möchte die folgenden Prozesse mit beenden
pkill "run_tcp_sender.sh"
oder
pkill -SIGKILL "run_tcp_sender.sh"
root 14320 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14323 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14325 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14327 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14328 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
root 14330 1 0 2012 ? 00:00:00 bash run_tcp_sender.sh 138.96.116.22
aber es ist nutzlos, die Prozesse bleiben dort, was ist mit meinem Befehl falsch?
Übrigens: Ich kann den folgenden Befehl verwenden, um das zu erreichen, was ich will
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
pgrep "run_tcp_sender.sh"
die Liste der Prozesse zurück, die Sie beenden möchten, oder gibt sie nur eine leere Liste zurück, da alle Prozesse als aufgelistet sindbash run_tcp_sender.sh ...
?Antworten:
pkill
Standardmäßig sendet dasSIGTERM
Signal an Prozesse zum Stoppen. Hier ist eine Liste der Signale, die Sie an einen Prozess senden können. Sie können sie normalerweise nach Name oder Nummer senden:Sie senden also Signal Nr. 15. Wenn die Prozesse nicht auf dieses Signal reagieren, müssen Sie möglicherweise Signal Nr. 9 verwenden
pkill -SIGKILL
.Aus der Manpage von pkill :
Probleme mit pkill
Das OP erwähnte, dass es ihm nicht gelungen sei,
pkill -SIGKILL "run_tcp"
zur Arbeit zu kommen. Wir dachten zunächst, dass das Problem damit zu tun hat, sichpkill
möglicherweise selbst zu töten, bevor alle "run_tcp" -Prozesse beendet wurden.Aber das war angesichts einer Fußnote auf der
pkill
Manpage schwer zu akzeptieren :Darüber hinaus hat @Gilles einen Kommentar hinterlassen, der im Grunde dasselbe sagt, was sich
pkill
einfach nicht selbst tötet. Dann gab er uns einen ziemlich großen Hinweis darauf, was tatsächlich vor sich ging.Hier ist ein Beispiel, das zeigt, was dem OP und mir gefehlt hat:
Schritt 1 - Erstellen Sie ein sleepy.bash-Skript
Schritt 2 - Laden Sie einige falsche Schlafaufgaben
Schritt 3 - Überprüfen Sie die laufenden Aufgaben
Schritt 4 - versuchen Sie es mit meinem Pkill
Schritt 5 - Was ist passiert?
Wenn
ps
wir den Befehl von oben ausführen, sehen wir, dass keiner der Prozesse abgebrochen wurde, genau wie das OPs-Problem. Was ist los?Es stellt sich heraus, dass dies ein Problem ist, wie wir versucht haben, davon Gebrauch zu machen
pkill
. Der Befehl:suchte nach einem Prozess namens "sleepy.bash" . Nun, es gibt keine Prozesse mit diesem Namen. Es gibt jedoch Prozesse mit dem Namen "bash sleepy.bash" . Also
pkill
suchte ich nach Prozessen, um zu töten und keine zu finden und dann zu beenden.Wenn wir also das,
pkill
was wir verwenden, leicht daran anpassen :Jetzt bekommen wir den Effekt, den wir gesucht haben. Was ist der Unterschied? Wir haben den
-f
Schalter verwendet, zupkill
dempkill
der gesamte Befehlszeilenpfad verwendet wird, wenn nur der Prozessname abgeglichen wird.von pkill man page
Alternative Methoden
töten, ps
Diese Methode ist ziemlich ausführlich, macht aber auch den Job:
pgrep w / pkill & killall
Sie können entweder
pgrep
eine Liste von PIDs eingebenpkill
oderkillall
stattdessen verwenden.Beispiele
Verweise
quelle
kill -9 $(ps -ef|grep "run_tcp"|grep -v "grep"|awk '{print $2}')
zum Töten verwenden, seltsam! wissen Sie, warum? dankepkill
tötet sich nicht selbst und nein, es geht nicht darum, welches Signal gesendet wird. Es wird kein Signal gesendet, da es keinen Prozess mit diesem Namen gibt.Dies hängt nicht mit der übergeordneten Prozess-ID zusammen. Das Problem ist einfach, dass Sie alle laufenden Prozesse beenden
run_tcp_sender.sh
, aber keine solchen Prozesse haben - die Prozesse, an denen Sie interessiert sind, werden ausgeführtbash
.Sie können
pkill
die Übereinstimmung in der gesamten Befehlszeile anweisen :Ein anderer Ansatz wäre, alle Prozesse zu beenden, bei denen das Skript geöffnet ist. Dies könnte Kollateralschäden verursachen, z. B. bei einem Editor, der gerade das Skript geöffnet hat.
Solange Sie das Skript nicht als root bearbeiten, kann das Problem behoben werden, indem nur die Prozesse von root beendet werden:
quelle
Versuchen Sie, den Prozess mit "Signal 9" zu beenden, ich meine verwenden
Normalerweise wird Signal 9 nicht zum Beenden der Datenbank-Engine empfohlen
Wenn der Prozess im Speicher verbleibt, geht ein E / A verloren oder der Prozess wartet auf den Abschluss der E / A.
quelle