Как параллельно запускать команды в bash? - PullRequest
4 голосов
/ 30 мая 2019

Об этом уже спрашивали, и есть много ответов, но мои потребности более конкретны:

  • Все процессы, которые мне нужны, - это длительные процессы, которые не завершаются (обычно).
  • Я не хочу просто запускать их в фоновом режиме, так как мне нужно увидеть их вывод.
  • Если какой-либо из процессов завершается, я хочу, чтобы остальные тоже были автоматически убиты.
  • Если я использую Ctrl + C или другой сигнал в основной команде, используемой для их запуска, я хочу уничтожить все процессы.

Например, использование & + wait не удовлетворяет последнему пункту. Параллель GNU кажется довольно сложной и, возможно, способна это сделать, но я не могу найти хороший пример, как ее использовать.

Ответы [ 3 ]

3 голосов
/ 30 мая 2019

После того, как какое-то время возился с GNU parallel, похоже, это работает как мне нужно.

Добавлены скрипты, которые мне нужно запустить, в мой Makefile, чтобы они были доступны как make consume, make projectи make run.

Теперь я запускаю их параллельно, как это:

parallel --ungroup --halt now,success=1,fail=1 make ::: consume project run

С --ungroup я вижу, что вывод и убийство, похоже, тоже работают, как и ожидалось.Единственное отличие от моего первоначального поста состоит в том, что когда одна из программ заканчивается, другие не убиваются.Но это не имеет значения.

2 голосов
/ 30 мая 2019

Все процессы, которые мне нужно запустить, - это все долго выполняющиеся процессы, которые не завершаются (обычно).

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

Давайте предположим, что ваша система инициализации systemd , котораяэто то, что используют современные дистрибутивы Red Hat и Debian.

Я не хочу просто запускать их в фоновом режиме, так как мне нужно видеть их вывод.

systemd автоматически захватываетstdout и stderr и сохраняет их в своем журнале.Такие команды, как systemctl status <service> и journalctl, предоставляют множество способов просмотра и поиска данных журнала.Вы можете фильтровать по уровню серьезности, или по времени, или по многим другим полям метаданных.Вы можете посмотреть выходные данные для одной службы или комбинированные выходные данные для нескольких служб.

Если какой-либо из процессов завершается, я хочу, чтобы остальные также автоматически уничтожались.

systemd позволяет вам выразить это с помощью BindsTo=, Requires= или других подобных опций.Подробнее см. Справочную страницу systemd.unit .

Если я использую Ctrl + C или другой сигнал в основной команде, используемой для их запуска, я хочу уничтожить все процессы.

Вы можете остановить услуги с помощью systemctl stop <service>.Он остановит именованный сервис и его зависимые элементы.

Для выборки всего, что systemd может сделать для вас, просмотрите его руководство:

0 голосов
/ 30 мая 2019

вы можете использовать xargs -P0


-P max-procs, --max-procs = max-procs Запускать до процессов max-procs одновременно; по умолчанию равно 1. Если max-procs равно 0, xargs будет запускать как можно больше процессов одновременно. Используйте опцию -n или опция -L с -P; в противном случае есть вероятность, что будет выполнен только один исполнитель. Во время работы xargs вы можете отправить его процессу сигнал SIGUSR1 для увеличения количество команд, запускаемых одновременно, или SIGUSR2 для уменьшения количества. Вы не можете увеличить его выше определенного предела реализации (который показывается с --show-limit). Вы не можете уменьшить его ниже 1. xargs никогда не завершает свои команды; когда его просят уменьшить, он просто ждет более одного Команда isting для завершения перед запуском другого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...