2017-11-02 2 views
0

Ich bin neu in Skripting in Bash; Ich möchte einen Prozess ausführen, der für immer ausgeführt wird (d. h. Gulp) und ihn beim Drucken zum Anzeigen einer Zeile anhält.Bash-Skript, stoppe einen Prozess für immer, wenn eine Zeile gedruckt wird

In meinem Fall, wenn ich Gulp beginne, druckt es Tausende von Zeilen (es dauert etwa 20 Sekunden), dann bleibt es in Wartestellung; die letzte Zeile gibt es immer

[Browsersync] Serving files from: src 

Ich habe versucht, mein Ziel mit diesem Skript zu erreichen:

cd ~/mydir 
gulp serve & 
while read -r line; do 
    if [ "$line"=="[Browsersync] Serving files from: src" ]; then 
    echo 'pid of Gulp before killing it is : ' `pidof gulp` 
    # Get its PID 
    PID=$! 
    kill -INT $PID 
    echo 'pid of Gulp now is : ' `pidof gulp` 
    fi 
done 

Aber dies nicht zu stoppen schluck Prozess. Was mache ich falsch?

EDIT: Beachten Sie, dass dies nur ein Teil des gesamten Skripts ist.

+0

es mit if [ "$ line" = "[Browsersync] Serving-Dateien aus: src"] nicht funktioniert; und if ["$ line" = "[Browsersync] Dateien von: src"]; entweder – Diego

Antwort

1

Sie müssen den Ausgang Ihres Hintergrundprogramms mit dem Eingang read verbinden.

Der einfachste Weg, es zu tun, ist es als bashcoprocess auszuführen:

A Koprozeß ausgeführt wird asynchron in einer Subshell, als ob der Befehl mit dem & Bekämpfer beendet worden war, mit einem Zweiwege-Leitung zwischen der ausführenden Shell und dem Coprozess.

Die Standardausgabe des Befehls (gulp serve) wird in einem Dateideskriptor in COPROC[0] (erstes Element des COPROC array), und die PID in COPROC_PID verfügbar sein.

Zum Beispiel:

#!/bin/bash 
coproc gulp serve 
while IFS= read -r line; do 
    if [ "$line" == "[Browsersync] Serving files from: src" ]; then 
     kill -INT "$COPROC_PID" 
    fi 
done <&"${COPROC[0]}" 
+0

Ich habe diese Lösung versucht, aber ich denke, Schluck Serve wird gestoppt, sobald es gestartet wird, weil es nicht ihre Zeilen auf dem Bildschirm drucken; oder ist es ein normales Verhalten? – Diego

+0

Sehen Sie sich die Ausgabe von gulp an, indem Sie zwischen "while" und "if" ein Echo "$ line" einfügen. Vielleicht geht es normal, ohne etwas zu drucken. – randomir

+1

Sie hatten Recht! Gulp Output ist genau das, was erwartet wird, vielen Dank für Ihre Hilfe! – Diego

Verwandte Themen