👨💻 Bash как диспетчер процессов через coproc для параллельных задач без временных файлов
👁 Когда Bash-скрипт запускает несколько долгих операций, обычный & быстро превращается в ручное управление PID, перенаправлениями и ожиданием завершения. У Bash есть менее известный механизм coproc, который запускает сопрограмму с собственными файловыми дескрипторами. Это позволяет обмениваться данными с фоновым процессом напрямую и управлять его жизненным циклом.
📝 Запуск фоновой задачи с двусторонним каналом
coproc автоматически создаёт каналы для stdin/stdout фонового процесса, поэтому данные можно отправлять и получать через файловые дескрипторы без промежуточных файлов и временных очередей.
coproc WORKER {
while IFS= read -r task; do
printf 'processed:%s\n' "$task"
done
}
printf '%s\n' task-1 task-2 task-3 >&"${WORKER[1]}"
exec {WORKER[1]}>&-
while IFS= read -r result; do
printf 'result => %s\n' "$result"
done <&"${WORKER[0]}"
wait "$WORKER_PID"
📝 Несколько независимых воркеров
Такой паттерн позволяет строить простые параллельные обработчики прямо средствами Bash: один процесс производит задания, несколько сопрограмм обрабатывают их независимо, а основной скрипт получает результаты через каналы.
coproc A { while read -r x; do echo "A:$x"; done; }
coproc B { while read -r x; do echo "B:$x"; done; }
echo "job-1" >&"${A[1]}"
echo "job-2" >&"${B[1]}"
exec {A[1]}>&-
exec {B[1]}>&-
cat <&"${A[0]}" &
cat <&"${B[0]}" &
wait
📝 Контроль завершения фонового процесса
В отличие от безымянных фоновых процессов, здесь сохраняется PID и файловые дескрипторы конкретной сопрограммы, поэтому можно явно контролировать её состояние и код завершения.
coproc WORKER { sleep 30; echo done; }
if kill -0 "$WORKER_PID" 2>/dev/null; then
echo "worker is running"
fi
wait "$WORKER_PID"
status=$?
printf 'exit code: %d\n' "$status"
❗️ coproc особенно полезен для сложных автоматизаций, где нужно одновременно запускать долгие процессы, передавать им данные и получать результаты. Это позволяет строить асинхронные конвейеры средствами самого Bash, не переходя сразу к Python или отдельному менеджеру очередей.
tags: #bash #автоматизация
🧭 @recura_tech 🌐 VK 🌐 MAX