Очередь с использованием нескольких процессов для запуска заданий bash
Мне нужно запустить много (сотни) команд в оболочке, но я хочу, чтобы только 4 процесса (из очереди) выполнялись одновременно. Каждый процесс будет длиться несколько часов.
Когда процесс завершится, я хочу, чтобы следующая команда "выскочила" из очереди и была выполнена.
Я также хочу иметь возможность добавлять больше процессов после начала, и было бы здорово, если бы я мог удалить некоторые задания из очереди или хотя бы очистить очередь.
Я видел решения, использующие makefile, но это работает, только если у меня есть весь список команд до начала. Также пытался использовать mkfifo sjobq и другие, но я так и не смог достичь своих потребностей...
У кого-нибудь есть код для решения этой проблемы?
Изменить: в ответ на Марк Сетчелл
Решение с tail -f и параллелью почти идеально, но когда я делаю это, он всегда не запускает последние 4 команды, пока я не добавлю больше, и так далее, я не знаю почему, и это довольно хлопотно..,
Что касается Redis, хорошее решение также, но это займет больше времени, чтобы освоить все это.
Спасибо!
1 ответ
Используйте GNU Parallel, чтобы создать очередь заданий следующим образом:
# Clear out file containing job queue
> jobqueue
# Start GNU Parallel processing jobs from queue
# -k means "keep" output in order
# -j 4 means run 4 jobs at a time
tail -f jobqueue | parallel -k -j 4
# From another terminal, submit 40 jobs to the queue
for i in {1..40}; do echo "sleep 5;date +'%H:%M:%S Job $i'"; done >> jobqueue
Другой вариант - использовать REDIS - смотрите мой ответ здесь. Выполните несколько заданий параллельно и эффективно.