Ich versuche, einige Befehle auszuführen, die nie beendet werden. Diese Befehle überwachen ein Verzeichnis und aktualisieren Dateien, wenn sie sich ändern. Die Idee ist, dass ich mehrere Ordner benötige, die von verschiedenen Tools überwacht werden und die ich alle mit einem einzigen Befehl ausführen kann.
Bei normalen Befehlen, die wie erwartet zurückgegeben werden, funktioniert die Trennung der Befehle durch ;
ein.
ls /;
cd /;
ls var;
cd var;
ls log;
cd log
tail -f <some_file>
Wenn ich versuche, nicht zurückgebende Befehle (wie oder ) aneinanderzureihen coffee -c -w <some_coffeescript_folder>
, wird nur der erste Befehl ausgeführt.
Gibt es eine Möglichkeit, dies mit einem einzigen Befehl zu tun? Hier sind die Befehle, die ich miteinander verknüpfen möchte:
coffee -c -m -w public/javascript/*.coffee; \
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/; \
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/;
Antwort1
Sie können sie im Hintergrund ausführen, indem Sie dem Befehl ein Et-Zeichen hinzufügen:
coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &
Wenn Sie alle Jobs sehen möchten, die aktuell im Hintergrund laufen, führen Sie Folgendes aus:
jobs -l
Um einen Hintergrundjob wieder in den Vordergrund zu bringen, verwenden Sie fg (PID ist optional):
fg <PID>
Um einen Vordergrundjob (der Ihre Shell „blockiert“) zurück in den Hintergrundmodus zu schicken, verwenden Sie Strg-Z / bg:
$ tail -f foobar.log # is "blocking" your shell
(hit Ctrl-Z)
$ bg
Ich vermute, dass die Jobs an Ihre Shell gebunden sind und nicht automatisch geforkt werden. Das heißt, wenn Sie über SSH angemeldet sind und die Verbindung trennen, empfängt die Shell ein SIGHUP, das auch an die Jobs gesendet wird. Dadurch werden Ihre Befehle gestoppt/beendet.
Wenn Sie möchten, dass die Jobs auch nach dem Abmelden weiterlaufen, sollten Sie sich das in Bash integrierte „disown“ ansehen:
jobs # fetch job ID in the squre brackets
disown -h %<JOBID> # disown job by using the job ID
Eine andere Option ist „nohup“ (Befehl, kein in Bash integriertes Element) oder Sie verwenden einen Terminal-Multiplexer wie „screen“ oder „tmux“.
Antwort2
Versuche dies:
coffee -c -m -w public/javascript/*.coffee &
stylus views/stylesheets/*.styl -w -m --out public/stylesheets/ &
stylus views/stylesheets/lib/*.styl -w -m --out public/stylesheets/lib/ &