Wie kann ich nur töten, wenn der Prozess läuft?


13

Derzeit verwende ich folgende Zeile in meiner sh-Skriptdatei:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Aber ich frage mich, wie ich es nur aufrufen soll, wenn der Prozess ( myServerhier) läuft.


Es ist unmöglich, killnur aufzurufen , wenn der Prozess ausgeführt wird, da zwischen dem Test und dem Aufruf von eine Race-Bedingung besteht kill(es ist möglich, dass der Prozess in dieser kurzen Zeit aus einem anderen Grund gestoppt wurde). Sie sollten verwenden pkilloder killallgenau das tun, was Sie versuchen, aber mit weniger zu tippen (und wahrscheinlich auch einige andere Vorteile).
10.

Antworten:


18

Normalerweise benutze ich nur pgrep und pkill

if pgrep myServer; then pkill myServer; fi

7
Warum nicht pkill myServeroder killall -q myServer? Der Versuch, nicht vorhandene Prozesse zu beenden, hat keinen Nachteil.
David Foerster

11
0 wird nicht beendet, wenn kein Prozess zum Beenden vorhanden ist, sodass Skripte beschädigt werden können.
boutch55555

6
|| trueDann anhängen .
David Foerster

Stimmt, aber Sie haben nicht die Flexibilität, ein anderes hinzuzufügen, um Sie darüber zu informieren, dass der Prozess bereits beendet war.
boutch55555

Was ist mit if ! killall -q myServer; then echo ERROR; fi?
David Foerster

9

Sie können Prozesse mit Namen beenden pkilloder killallihre Manpages überprüfen.


Ja, im Gegensatz dazu killwird dies nur beendet, wenn der Prozess ausgeführt wird. Zum Beispielpkill -u myuser -f myprocess\.[0-9]+
Chase T.

6

Ein etwas anderer Ansatz wäre ungefähr so:

killall PROCESS || echo "Process was not running."

Dadurch wird der 1vom killallBefehl zurückgegebene Fehlercode vermieden, wenn der Prozess nicht vorhanden war. Der echoTeil wird nur dann in Aktion treten, wenn er killallzurückkehrt 1, während er selbst zurückkehrt 0(Erfolg).


5
Verwenden killall -qist besser
Anwar

1
Achtung, killall -qwird nicht von allen Unix-Varianten unterstützt, macOS Catalina hat es immer noch nicht.
Tresf

0

versuchen Sie es mit:

sudo kill `pidof process_name`

Dabei ist process_name der Name des Prozesses, den Sie beenden möchten. Das Tolle daran ist, dass pidof die Pids aller Prozesse auflistet, die mit dem angegebenen Namen übereinstimmen. Da kill mehrere Pids akzeptiert, werden alle in einer einzigen Laune getötet.

Lassen Sie mich wissen, ob das hilft.


Was ist, wenn die Liste leer ist? (Mein Hauptpunkt war, wenn möglich überhaupt nicht töten zu nennen)
myWallJSON

1
Wenn die Liste leer ist, gibt kill einen Fehlercode 1 zurück und tötet nichts. Es wäre das Äquivalent zu dem Versuch, kill ohne Argumente aufzurufen. Sie können eine if-Anweisung hinzufügen, die zuerst überprüft, ob pidof eine leere Liste zurückgibt. Wenn keine leere Liste zurückgegeben wird, rufen Sie an kill `pidof process_name. Wenn eine leere Liste zurückgegeben wird, überspringen Sie den Kill-Aufruf.
Amandion

0

Kleines Skript, das ich mit F & E erstellt habe. ich hoffe du wirst es mögen

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

Speichern Sie es dann mit einem Namen wie script.sh

chmod +x script.sh
./script.sh

Geben Sie dann Ihren Prozessnamen an.

Hinweis: Ich habe es schon oft versucht und es ist in Ordnung.


Darf ich wissen, was mit diesem Skript falsch ist und -ve Abstimmung braucht eine Erklärung bitte.
rɑːdʒɑ

Nichts falsch mit diesem Skript ... +1
WinEunuuchs2Unix

0

Überprüfen Sie, ob der Prozess mit existiert pidof. Wenn ja, töte es:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Der Exit-Code ist nach Ausführung des obigen Befehls immer 0.


-1

Ich würde ... benutzen:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

Das xargs -rweist an, kill nur auszuführen, wenn Eingaben vorhanden sind. Das ps --no-header -eo pid,cmdbringt die Ausgabe in ein besseres Format zum Parsen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.