Beenden Sie laufende Prozessinstanzen, außer wenn diese durch die Ausführung des aktuellen Befehls ausgelöst werden.

Beenden Sie laufende Prozessinstanzen, außer wenn diese durch die Ausführung des aktuellen Befehls ausgelöst werden.

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

psDas 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, awkwird 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 awkauch der Prozess beendet wurde), awkexistiert dieser Prozess nicht mehr und killstöß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, awkin 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

verwandte Informationen