Anmutiger Weg, um Prozess zu töten

12

Nachdem mein Bash-Skript mit dem Selenium-Server fertig ist, beendet das Skript es folgendermaßen:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Während dies funktioniert und das Selenium-Skript beendet wird, wird auch versucht, den Prozess zu grep seleniumbeenden. Wenn also die Prozessnummer wieder dem Befehl kill entspricht, ist der Prozess beendet und es wird eine Fehlermeldung generiert. (Mit anderen Worten: Es werden zwei Prozesse beendet, einer davon ist der echte Selenserver, der andere ist ein flüchtiger Prozess, der ein Nebeneffekt der Ausführung dieses Befehls ist.)

Gibt es einen anmutigeren Weg, um den Prozess zu beenden, der diesen unbeabsichtigten Nebeneffekt nicht hat?

(Nach einer Idee, die ich hatte: Dasselbe Skript startet Selen früher im Skript. Wenn es also eine Möglichkeit gäbe, die PID beim Starten von Selen zu erfassen, könnte ich sie einfach behalten und direkt töten, anstatt danach zu greifen Das Problem ist, dass ich nicht weiß, wie man diese PID erhält, wie man eine Variable verwendet, um sie zu behalten und wie man sie später im Skript referenziert.

Eric
quelle

Antworten:

12

Versuchen Sie zu verwenden, pkill seleniumwenn weder diese noch eine der anderen funktionieren, können Sie Ihre Methode mit einer anderen Pipe-Sequenz wie z

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`
Momo
quelle
pkill funktioniert auf meinem Server dafür nicht, aber Ihr verbesserter Grep-Strip hilft sehr.
Eric
20

Probieren Sie den pgrepBefehl aus, der die PID des gewünschten Befehls ausgibt.

pgrep selenium

Verwenden Sie den Companion- pkillBefehl, um den Vorgang tatsächlich abzubrechen .

pkill selenium
mills013
quelle
Ich mag die Eleganz, aber der Prozess sieht so aus: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. jar "so habe ich es gerade geändert pgrep javaund es funktioniert :-) danke!
Eric
2
Wenn Sie pgrep das Flag '-f' geben, wird das Muster mit der gesamten Befehlszeile abgeglichen. In diesem Fall pgrep -f seleniumsollte kill also funktionieren
mills013 29.02.12
7
Verwenden pkillist viel einfacher. pkillVerwendet genau die gleichen Übereinstimmungskriterien wie pgrep. Sie können dies also mit dem Befehl 1 anstelle von 2 ausführen (und müssen sich auf die Ausgabe von 1 verlassen).
Patrick
7

Versuchen Sie es mit grep [s]elenium. Dies wird den Grep-Prozess nicht finden.

BillThor
quelle
Dies ist in der Tat ein praktischer Trick. Warum funktioniert es?
2
@hesse - grepverwendet standardmäßig BREs. Das heißt, [und ]zeigt sich in argvfür grep, aber es stimmt nicht überein , weil [und ]nicht buchstäblich verwendet werden grep.
Chris Down
Ich habe oft eine | grep -v grepKomponente im Rohr verwendet. Aber das ist ziemlich elegant und ich mag es!
Alexios
Dies reicht (oft) nicht aus, wenn Sie im aktuellen Arbeitsverzeichnis eine Datei haben, die denselben Namen hat wie der Prozess, nach dem Sie suchen. So ist die Lösung , die ich normalerweise benutzen ps -ef | grep \[s]elenium. Obwohl ich fand lsof, dass es eine viel bessere Alternative zu psund ist grep.
Moreaki
2

Der killallBefehl wurde nicht erwähnt, und ich halte ihn für eine nützliche Ergänzung des Repertoires.

$ killall selenium

Sie können auch die -r regexOption verwenden, um einen regulären Ausdruck anzugeben, der dem Prozessnamen und sogar einem Zeitwert entspricht:

$ killall -o 5m selenium 

Tötet alle Selenprozesse ab, die älter als 5 Minuten sind.

kwarrick
quelle
killall
Dies
0

Verwenden Sie die -m 1Option mit dem Befehl grep, um nur den ersten gefundenen Prozess abzurufen. Solange Sie Ihre Prozesse aufsteigend nach PID sortieren, funktioniert dies.

hellodanylo
quelle
1
Sie können nicht sicher sein, dass der Selenprozess eine niedrigere PID verwendet.
FJRA
FJRA, ein früher gestarteter Prozess erhält immer eine niedrigere PID. Da der Selenserver vor dem 'grep-Selen' gestartet wird, erhält er eine niedrigere PID.
Hellodanylo