Параллельное выполнение команд, которые никогда не завершаются

Параллельное выполнение команд, которые никогда не завершаются

Я пытаюсь запустить несколько команд, которые никогда не завершаются. Эти команды отслеживают каталог и обновляют файлы при их изменении. Идея в том, что мне нужно несколько папок, отслеживаемых разными инструментами, и возможность запускать их все из одной команды.

Для обычных команд, которые возвращают ожидаемый результат, разделение команд точкой ;работает.

ls /;
cd /;
ls var;
cd var;
ls log;
cd log

При попытке объединить в цепочку невозвращающиеся команды (например, tail -f <some_file>или ) coffee -c -w <some_coffeescript_folder>, будет выполнена только первая команда.

Есть ли способ сделать это одной командой? Вот команды, которые я пытаюсь связать вместе:

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/;

решение1

Вы можете запустить их в фоновом режиме, добавив амперсанд к команде:

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/ &

Если вы хотите увидеть все задания, которые в данный момент выполняются в фоновом режиме, выполните следующее:

jobs -l

Чтобы вернуть фоновое задание на передний план, используйте fg (PID необязателен):

fg <PID>

Чтобы вернуть приоритетное задание (которое «блокирует» вашу оболочку) обратно в фоновый режим, используйте Ctrl-Z / bg:

$ tail -f foobar.log # is "blocking" your shell
(hit Ctrl-Z)
$ bg

Я полагаю, что задания привязаны к вашей оболочке и не будут разветвляться автоматически. Это означает, что если вы вошли в систему через SSH и отключились, оболочка получает SIGHUP, который также будет отправлен заданиям. Это остановит/завершит ваши команды.

Если вы хотите, чтобы задания продолжали работать даже после выхода из системы, вам, возможно, стоит обратить внимание на встроенную в bash команду «disown»:

jobs               # fetch job ID in the squre brackets
disown -h %<JOBID> # disown job by using the job ID

Другой вариант — «nohup» (команда, не встроенная в bash) или использование терминального мультиплексора, например «screen» или «tmux».

решение2

Попробуй это:

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/ &

Связанный контент