TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #108 603
Параллельное выполнение задач в Bash: ускоряем скрипты и контролируем фоновые процессы

Когда вы запускаете множество команд последовательно, выполнение скрипта может занять значительное время. Параллельное выполнение задач позволяет значительно ускорить процесс, особенно если команды не зависят друг от друга. В этой статье рассмотрим:

Как запустить команды в фоне.
Как ограничить количество параллельно выполняемых задач.
Сравним результаты для наглядной демонстрации.


1. Параллельное выполнение с &. Чтобы запустить команду в фоновом режиме, просто добавьте & в конце строки:


sleep 5 & # Фоновая задача
echo "Команда завершена"
wait # Ожидание завершения всех фоновых задач


2. Ограничение количества фоновых задач. Когда слишком много задач выполняются параллельно, это может перегрузить систему. Чтобы избежать этого, можно использовать ограничение.

Пример с семафором (функция parallel_run):


#!/bin/bash

# Функция для параллельного выполнения с ограничением
parallel_run() {
local max_jobs=4 # Максимальное количество фоновых задач
local job_count=0

for i in {1..10}; do
{
echo "Начало задачи $i"
sleep $((RANDOM % 5 + 1)) # Симуляция работы
echo "Задача $i завершена"
} &

((job_count++))
if [[ $job_count -ge $max_jobs ]]; then
wait -n # Ждём завершения одной из задач
((job_count--))
fi
done

wait # Ожидание завершения всех оставшихся задач
}

# Запуск
parallel_run


Результат выполнения:


Начало задачи 1
Начало задачи 2
Начало задачи 3
Начало задачи 4
Задача 2 завершена
Начало задачи 5
...


Количество одновременно выполняемых задач не превышает 4.

3. Сравнение производительности

Скрипт с последовательным выполнением:


#!/bin/bash
for i in {1..10}; do
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
done


Результат: время выполнения = 10 задач × 2 секунды = 20 секунд.

Скрипт с параллельным выполнением:


Копировать код
#!/bin/bash
for i in {1..10}; do
{
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
} &
done
wait


Результат: Все задачи запускаются одновременно. Время выполнения ≈ 2 секунды.

Скрипт с ограничением фоновых задач:


Копировать код
#!/bin/bash
parallel_run() {
local max_jobs=3
local job_count=0

for i in {1..10}; do
{
echo "Выполняется задача $i"
sleep 2 # Симуляция работы
echo "Задача $i завершена"
} &
((job_count++))
if [[ $job_count -ge $max_jobs ]]; then
wait -n
((job_count--))
fi
done
wait
}

parallel_run


Результат: Ограничение до 3 задач одновременно. Время выполнения ≈ 7–8 секунд.

---

Дополнительный инструмент: xargs
Для простого ограничения количества задач можно использовать xargs с флагом -P:


seq 1 10 | xargs -n1 -P4 -I{} bash -c 'echo "Начало задачи {}"; sleep 2; echo "Задача {} завершена"'


-P4: ограничение на 4 параллельные задачи.

В результате получается, что параллельное выполнение задач в Bash значительно ускоряет работу скриптов:

👎 Полное отсутствие ограничений может перегрузить систему.
👍 Ограничение количества задач помогает сбалансировать нагрузку.
👍 Использование инструментов, таких как wait, xargs, или написание собственных функций, позволяет гибко управлять параллельностью.

BashTex 📱 #linux #utils
  • 👍 8
More from @bash_tex
  1. Oct 13, 2026openat2(): как Linux защищает от выхода за пределы каталога Допустим, приложение должно чи…
  2. Oct 12, 2026xargs против while read: где быстрее и безопаснее Обе конструкции позволяют обработать спи…
  3. Oct 9, 2026BashTex 📱 #мем
  4. Oct 8, 2026Bridge FDB - как Linux bridge узнаёт, где находится MAC Linux bridge не знает заранее, за…
  5. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  6. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →