▪️ Базовый пример: запуск в фоне
for f in *.log; do
gzip "$f" &
done
wait
Все файлы сжимаются одновременно - но это нагружает CPU. Хотелось бы ограничить количество потоков, для этого добавим контроль.
▪️ Контроль количества одновременно работающих задач
Классика для bash 4+:
MAXJOBS=4
for f in *.log; do
gzip "$f" &
(( $(jobs -r | wc -l) >= MAXJOBS )) && wait -n
done
wait
jobs -r- считает активные фоновые процессыwait -n- дожидается завершения одного из них
В итоге максимум 4 задачи одновременно
▪️ Ещё лаконичнее через xargs
ls *.log | xargs -n1 -P4 bash -c 'gzip "$0"'
-n1 - по одному аргументу на процесс
-P4 - максимум 4 параллельных процесса
bash -c 'gzip "$0"' - шаблон выполнения
🌟 Работает даже в старых системах (без wait -n).
▪️ Чуть сложнее: обработка с логированием и статусом
process_file() {
local f="$1"
echo "[START] $f"
sleep $((RANDOM % 5)) # эмуляция нагрузки
echo "[DONE] $f"
}
export -f process_file
ls *.log | xargs -n1 -P3 bash -c 'process_file "$0"'
Вывод:
[START] file1.log
[START] file2.log
[START] file3.log
[DONE] file2.log
[DONE] file1.log
[START] file4.log
[DONE] file3.log
[DONE] file4.log
Все просто, читаемо и работает без внешних зависимостей.
BashTex 📱 #bash #utils