2016-07-22 29 views
0

Ich versuche, ein Shell-Skript (für die Verwendung in Mac OS X-Terminal) zu schreiben, das einen Befehl ausführen wird, um einen Entwicklungsserver (Schluck-Serve) zu starten. Ich habe es funktioniert, außer der Server läuft ständig, so dass es mir nicht erlaubt, nachfolgende Befehle in demselben Fenster einzugeben, ohne den Server anzuhalten (Strg + C). Meine Frage ist, gibt es eine Möglichkeit, kann ich den Prozess im Hintergrund ausführen und/oder unterdrücken alle/alle Ausgaben? Mein Ziel ist es, einen 'stop server' Befehl zu schreiben, der den Prozess abbricht (was ich auch nicht weiß, wie es geht). Ich habe alle Kombinationen der Verwendung von kaufmännisch und &>/dev/null versucht und nichts funktioniert. Hier ist, was ich bisher:Wie führst du einen Shell-Befehl im Hintergrund aus und unterdrückst alle Ausgaben?

if [ "$1" = "server" ] 
then 
    if [ "$2" = "on" ] 
    then 
    cd/& gulp serve --gulpfile /server/example/gulpfile.js # the output is still shown 
    printf "\033[0;32mserver is online.\033[0m\n" 
    else 
    killall tail &>/dev/null 2>&1 # this doesn't kill the process 
    printf "\033[0;32mportals is offline.\033[0m\n" 
    fi 
fi 

Antwort

2

Sie machen die Umleitung der Ausgabe auf killall, nicht gulp, töten so gulp wird weiterhin fröhlich Text zu Ihrem Terminal aufzuschlüsseln. Versuchen Sie stattdessen:

cd/&& gulp server --gulpfile /server/example/gulpfile.js >/dev/null 2>&1 & 

Zweitens tötet Ihr Kill-Befehl nicht Ihren Prozess, weil Sie es nicht sagen; Sie bitten es alle tail Prozesse zu töten. Sie möchten stattdessen:

killall gulp 

Diese Änderungen sollten der direkteste Weg zu Ihrem Ziel sein. Es gibt jedoch ein paar zusätzliche Dinge, die nützlich sein können, um zu wissen.

Das Prozessmanagement hat eine lange Geschichte in der * nix-Welt, und deshalb haben wir Werkzeuge erfunden, um dies für lange Zeit zu vereinfachen. Sie können sie selbst neu erfinden (der nächste Schritt wäre, die PID Ihres Schluckprozesses zu speichern, so dass Sie sicherstellen können, dass Sie nur töten und nichts anderes mit "Schluck" im Namen), oder Sie können alle gehen den Weg und schreibe eine Systemüberwachungsdatei. Für Linux wäre dies SysV, Upstart oder systemd; Ich bin mir nicht sicher, was das Äquivalent von OS X ist.

Da Sie dies jedoch nur für Entwicklungszwecke tun, keine Produktions-Website, brauchen Sie das wahrscheinlich nicht wirklich; Ihr tatsächliches Ziel ist es, Ad-hoc-Shell-Befehle auszuführen, während gulp ausgeführt wird. Sie können dazu die Terminal-Registerkarten verwenden oder die Trennfunktionen von iTerm, screen oder tmux eleganter nutzen. Tmux ist insbesondere ein nützliches Werkzeug, wenn Sie viel in einem Terminal arbeiten, und wäre eine nützliche Sache, mit der Sie sich vertraut machen.

+0

Dies hat den Trick, danke für die Antwort und die detaillierte Erklärung! Danke auch an @Diego Torres Milano! – robmarston

1

Zuerst den Prozess im Hintergrund

cd/&& gulp serve --gulpfile /server/example/gulpfile.js > /tmp/gulp.log & 

nach laufen cd Sie müssen && (und) und & im Hintergrund am Ende laufen.

Um alle gulp Prozesse

killall gulp 
+1

Wenn Sie die Ausgabe * all * unterdrücken möchten, sollten Sie 'stderr' ebenfalls umleiten. Etwas wie: 'schluck Server --parms ......> /tmp/gulp.log 2> & 1 &'. Das sagt "redirect handle 2 (' stderror') an die gleiche Stelle wie handle 1 ('stdout')". Bestellung ist hier, so muss es nach 1 gemacht werden. – gilez