Когда вы автоматизируете инфраструктуру, часто приходится запускать десятки или сотни задач - но неконтролируемый параллелизм может уронить систему. Вместо этого - реализуем контролируемую очередь, ограничивающую количество одновременных процессов.
▪️ Идея:
Создаём продвинутую фоновую очередь на Bash, с:
ограничением на количество параллельных задач;
логированием статуса выполнения;
возможностью динамически подставлять команды.
▪️ Пример:
#!/usr/bin/env bash
set -euo pipefail
MAX_PARALLEL=4
LOGFILE="./queue.log"
TASKS=(
"sleep 3 && echo task1"
"sleep 2 && echo task2"
"sleep 1 && echo task3"
"sleep 4 && echo task4"
"sleep 5 && echo task5"
"sleep 2 && echo task6"
)
run_task() {
local cmd="$1"
local id=$(date +%s%N)
echo "[$id] START: $cmd" >> "$LOGFILE"
eval "$cmd"
local status=$?
echo "[$id] END: $cmd (exit=$status)" >> "$LOGFILE"
return $status
}
active_jobs() {
jobs -rp | wc -l
}
for task in "${TASKS[@]}"; do
run_task "$task" &
# Ждём, если число фоновых задач превысило лимит
while (( $(active_jobs) >= MAX_PARALLEL )); do
sleep 0.2
done
done
wait
echo "Все задачи завершены. Лог: $LOGFILE"
▪️ Объяснение:
jobs -rp выводит только PID'ы активных фоновых процессов.
run_task() логирует начало, завершение и статус команды.
Используем eval - аккуратно, если команды приходят из недоверённого источника.
🌟 Такой подход можно использовать в:
CI/CD пайплайнах без внешних тулов;
миграции данных или резервном копировании;
массовой обработке видео/изображений;
сетевом сканировании и мониторинге.
BashTex 📱 #bash