2017-02-06 3 views
1

Ich bin auf der Suche nach einer sauberen Methode zum Starten und Stoppen von Java-Prozessen basierend auf stdout. Grundsätzlich möchte ich eine for-Schleife in Bash durchlaufen, die einen Java-Befehl mit Eingabevariablen startet, stdout auf eine bestimmte Zeichenkette "Results:" überwacht und dann den gleichen Prozess beendet, dann zum nächsten geht, einen neuen Java-Prozess startet und geht weiter.Starten und Stoppen des Prozesses in Bash Script

Ich habe versucht, mit Coproc zu arbeiten, aber nicht in der Lage, etwas in der Nähe zu arbeiten, wie beabsichtigt.

+0

setzen Sie Ihren Code, den Sie bereits geschrieben haben. –

+0

Das ist das Problem.Ich habe die grundlegende Logik des Skripts geschrieben (den Java-Befehl, den ich ausführen möchte, die for-Schleife, um den Java-Befehl basierend auf einer Konfigurationsdatei auszuführen, die sich in einem conf-Verzeichnis befindet.) Aber wenn es um die Logik geht Bin oben Listing, ich habe nicht einmal eine Ahnung, wo ich anfangen soll ... Ich bin ziemlich basic in meinem Bash Wissen/Erfahrung –

Antwort

1

können Sie coproc verwenden wie so:

coproc java … 
grep -q -m1 'Results:' <&$COPROC && kill $COPROC_PID 

Diese grep Lesen aus dem Java-Ausgang haben wird und es töten, sobald er eine passende Linie sieht.


Wenn Sie die Ausgabe des Befehls java, um zu sehen, anstatt dies zu tun, leise tee verwenden beide drucken die Ausgabe und an die grep … && kill … Gruppe senden.

coproc java … 
tee <&$COPROC >(grep -q -m1 'Results:' && kill $COPROC_PID) 
+0

Dies scheint definitiv der Weg zu gehen. Aus irgendeinem Grund, wenn ich den Java-Befehl ausführen, hängt es und wird nie zu der 'Results:' Zeichenfolge. Wenn ich den Befehl selbst ausführe, funktioniert es gut. Aber mit dem Koproc-Tag vorne scheint es nicht den gesamten normalen Stout-Stream auszugeben. –

+0

Sehen Sie * any * aus, wenn Sie das zweite Formular (mit 'tee') versuchen? –

+0

Ja. Es spuckt ein paar Warnungen über die Konfiguration der Protokolldatei aus (was normale Ausgabe ist ... erwartet), aber dann hängt es einfach und erreicht niemals die Zeile "Ergebnisse:". –

1

Ich würde screen verwenden. Es funktioniert für die meisten meiner Skripte:

Sitzung starten namens Myjava Befehl

screen -dmS myjava sh -c "/path/to/script.name parameters > /tmp/outfile" 

Sie hier die /tmp/outfile mit bash ... (tail -f oder etwas) überwachen wollte

und töten die Sitzung Myjava mit

screen -X -S myjava kill 
+0

Also in diesem Zusammenhang gehe ich davon aus, dass Sie den Java-Befehl in einer Variablen speichern " myjava "und dann die gleiche Bezeichnung verwenden, um den gleichen Befehl zu töten? Wo würde ich das Skript WHEN informieren, um den Prozess zu beenden ... wenn ich die richtige Zeile der Ausgabe im stdout finde ... wie weiß es, wann das auftaucht? –

+0

Oh, ich verstehe. myjava ist ein Name für die Bildschirmsitzung. Wählen Sie einen beliebigen Namen. Du sagst, du wirst das Stout von der Bash aus überwachen, also nehme ich an, du weißt schon, wie das geht. Wie auch immer, ich erkläre ein wenig die Antwort – jaromrax

0

Angenommen, Ihre Java-Code verlässt nur auf seine eigene, wenn es SIGPIPE empfängt, können Sie Rohr nur die Ausgabe an grep und haben grep exit as soon as it sees a match. Assuming you are using a version of grep that supports the -m option (GNU and BSD grep grep` Ausfahrt nach dem ersten Spiel:

java ... | grep -m 1 'Results:' 

One Kleiner Haken: wegen Pufferung kann Ihr java Programm noch eine sehr lange Zeit laufen, bevor grep tatsächlich die Zeile "Ergebnisse" anzeigt.


nur Standard grep verwenden, können Sie tee verwenden, um sowohl den Ausgang und Ausgang angezeigt werden nach jeder Partie zu finden.

java ... | grep 'Results:' | tee | grep -q '.*' 

Dies leidet die gleiche Pufferung Problem, aber verstärkt: nicht nur kann die erste grep warten müssen, bevor sie tatsächlich die „Ergebnisse“ Linie empfängt, aber tee kann in ähnlicher Weise warten müssen, bevor sie schließlich die gleiche Linie bekommt . Wenn die Leitung zu klein ist, kann die erste grep niemals mehr ausgeben, so dass Sie auf java warten müssen, bevor Sie natürlich eine Eingabe tätigen können, bevor Sie tee sehen.

Verwandte Themen