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


0

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

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

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

Что вы подразумеваете под «один за другим», если первый никогда не заканчивается? Когда вы хотите начать второй?
Хеннинг Махолм

@HenningMakholm Первый не закончится. Я просто хочу, чтобы все они бежали. Я полагаю, что здесь на самом деле не совсем верно, параллель была бы более точной. Я обновил вопрос.
AlbertEngelB

Ответы:


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».


Святой ... Отличный ответ, огромное спасибо! Я на самом деле настраиваю эти команды в ужасно убитом Makefile, но здесь есть много информации, о которой я не знал. Большое спасибо за ваш подробный ответ!
AlbertEngelB

Кстати, если вы хотите «посмотреть» каталог или файл, загляните в inotify и inotify-tools из командной строки github.com/rvoicilas/inotify-tools/wiki
Доминик Бартон,

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

Я действительно попробовал это, но у меня был дополнительный ;после амперсанда. Спасибо!
AlbertEngelB
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.