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 selenium
beenden. 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.
Probieren Sie den
pgrep
Befehl aus, der die PID des gewünschten Befehls ausgibt.Verwenden Sie den Companion-
pkill
Befehl, um den Vorgang tatsächlich abzubrechen .quelle
pgrep java
und es funktioniert :-) danke!pgrep -f selenium
sollte kill also funktionierenpkill
ist viel einfacher.pkill
Verwendet genau die gleichen Übereinstimmungskriterien wiepgrep
. Sie können dies also mit dem Befehl 1 anstelle von 2 ausführen (und müssen sich auf die Ausgabe von 1 verlassen).Versuchen Sie es mit
grep [s]elenium
. Dies wird den Grep-Prozess nicht finden.quelle
grep
verwendet standardmäßig BREs. Das heißt,[
und]
zeigt sich inargv
fürgrep
, aber es stimmt nicht überein , weil[
und]
nicht buchstäblich verwendet werdengrep
.| grep -v grep
Komponente im Rohr verwendet. Aber das ist ziemlich elegant und ich mag es!ps -ef | grep \[s]elenium
. Obwohl ich fandlsof
, dass es eine viel bessere Alternative zups
und istgrep
.Der
killall
Befehl wurde nicht erwähnt, und ich halte ihn für eine nützliche Ergänzung des Repertoires.Sie können auch die
-r regex
Option verwenden, um einen regulären Ausdruck anzugeben, der dem Prozessnamen und sogar einem Zeitwert entspricht:Tötet alle Selenprozesse ab, die älter als 5 Minuten sind.
quelle
killall
Verwenden Sie die
-m 1
Option mit dem Befehl grep, um nur den ersten gefundenen Prozess abzurufen. Solange Sie Ihre Prozesse aufsteigend nach PID sortieren, funktioniert dies.quelle