Очередь с использованием нескольких процессов для запуска заданий 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 - смотрите мой ответ здесь. Выполните несколько заданий параллельно и эффективно.

Другие вопросы по тегам