Prozess bei bestimmter Ausgabe beenden

Prozess bei bestimmter Ausgabe beenden

Wie kann ich einen Prozess bei einer bestimmten Ausgabe dieses Prozesses beenden? Wenn ich beispielsweise ein Java-Programm mit ausführe java -jar xyz.jar, möchte ich den Prozess beenden, sobald die Zeile „Server auf Port 8000 gestartet“ auf stdout erscheint.

Antwort1

Dies lässt sich mit dem folgenden Skript erreichen, sofern es grep -m1bei Ihnen nicht funktioniert:

#!/bin/bash

java -jar xyz.jar &> "/tmp/yourscriptlog.txt" &
processnumber=$!
tail -F "/tmp/yourscriptlog.txt" | awk  '/Started server on port 8000/ { system("kill '$processnumber'") }'

Grundsätzlich leitet dieses Skript den stdoutTeil Ihres Java-Codes mit dem Befehl in eine Datei um &> "/tmp/yourscriptlog.txt". Der letzte Befehl &in der ersten Zeile bewirkt, dass Ihr Code als isolierter Prozess ausgeführt wird, und in der nächsten Zeile haben wir die Nummer dieses Prozesses mit $!. Mit der Nummer des Prozesses und einer Protokolldatei tailkönnen wir den Prozess schließlich beenden, wenn die gewünschte Zeile ausgegeben wird.

Antwort2

java -jar xyz.jar | grep -m1 "Started server on port 8000"

Antwort3

Ich habe die Antwort von @Rafael für kompliziertere Fälle wie meinen angepasst, bei denen sich das Skript nicht einfach in den Hintergrund schieben lässt.

Öffnen Sie eine erste tmuxSitzung und geben Sie Ihren Befehl ein (verwenden Sie ihn teeanstelle der Umleitung, um die Ausgabe live anzuzeigen), und trennen Sie ihn dann mit Strg-B D:

java -jar xyz.jar &> '/var/log/myscript.log'

Behandeln Sie die Beendigung in einer anderen Tmux-Sitzung:

tail -F '/var/log/myscript.log' | awk '/Started server on port 8000/ { system("tmux kill-session -t 0") }'

Verwenden Sie eine benannte Sitzung, wenn Sie bereits andere tmux-Sitzungen ausführen.

verwandte Informationen