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 -m1
bei 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 stdout
Teil 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 tail
kö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 tmux
Sitzung und geben Sie Ihren Befehl ein (verwenden Sie ihn tee
anstelle 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.