Ich muss alle laufenden Instanzen von Xvfb mithilfe eines Shell-Skripts beenden, daher habe ich folgenden Code -
for pid in $(ps -ef | awk '/Xvfb/ {print $2}'); do kill -9 $pid; done
Es beendet alle Instanzen, aber eine schlägt mit folgendem Fehler fehl -
kill: (142898) - No such process
Scheint, als ob der oben ausgeführte Befehl eine weitere Instanz erstellt, die aber beim Beenden nicht mehr existiert. Wie kann ich das in diesem Fall überspringen und mit dem Skript erfolgreich sein?
Antwort1
ps
Das Problem besteht darin, dass Sie die Ausgabe von in einen Aufruf von weiterleiten awk
, der nach der Zeichenfolge „Xvfb“ sucht und daher auch die Zeichenfolge „Xvfb“ in seiner eigenen Befehlszeile enthält. Da beide Prozesse einer Pipe gleichzeitig ausgeführt werden, awk
wird der Aufruf selbst auch in der Ausgabe von registriert ps
(versuchen Sie, was passiert, wenn Sie einfach ps -ef | awk '/Xvfb/'
in die Befehlszeile tippen).
Wenn die Schleife jedoch gestartet wird (was passiert, wenn die Befehlsersetzung $( … )
und damit awk
auch der Prozess beendet wurde), awk
existiert dieser Prozess nicht mehr und kill
stößt daher auf Folgendes.
Sie sollten auf der sicheren Seite sein, wenn Sie den Befehl in der Befehlsersetzung ändern zu
ps -ef | awk '$0 ~ /Xvfb/ && index($0,"awk")==0 {print $2}'
Dadurch wird sichergestellt, dass kein Befehl, der die Teilzeichenfolge enthält, awk
in die Liste aufgenommen wird.
Antwort2
Sie versuchen, das zu töten awk
.
Um dies zu vermeiden, können Sie mit einem einfachen Regex-Trick eine Escape-Methode verwenden, zum Beispiel wor[d]
.
Also für Ihren Code (mit hinzugefügten Variablenzitaten)
for pid in $(ps -ef | awk '/Xvf[b]/ {print $2}'); do kill -9 "$pid"; done