Обычно Bash запускает фоновый процесс через
&, но передавать ему команды и получать ответы уже сложнее. Можно использовать временные файлы или именованные каналы, а можно обойтись встроенным
coproc.Он запускает процесс в фоне и создаёт два канала: один для записи в его stdin, другой для чтения stdout.
▪️Запускаем фоновый процесс
Например, создадим простой обработчик строк:
coproc WORKER {
while IFS= read -r line; do
printf 'Processed: %s\n' "$line"
done
}Bash создаст массив
WORKER с двумя файловыми дескрипторами:WORKER[0] # читаем stdout процесса
WORKER[1] # пишем в stdin процесса
При этом основной скрипт продолжит выполняться.
▪️Передаём данные и получаем ответ
Отправим строку обработчику:
printf 'hello\n' >&"${WORKER[1]}"Теперь прочитаем результат:
IFS= read -r result <&"${WORKER[0]}"
echo "$result"Получим:
Processed: hello
Процесс не пришлось запускать повторно. Он продолжает работать и ждать следующие строки.
▪️Зачем это нужно
Представим, что скрипт должен отправить тысячу запросов одной программе.
При обычном подходе:
for item in "${items[@]}"; do
processor "$item"
doneПрограмма запускается заново для каждого элемента.
С
coproc можно один раз запустить обработчик, передавать ему данные и читать ответы через открытые каналы.Это особенно полезно, если запуск программы дорогой или она поддерживает постоянный обмен сообщениями через stdin/stdout.
▪️Есть важный нюанс
Не каждая программа сразу отправляет данные в stdout. Некоторые буферизуют вывод, когда он подключён к каналу, а не к терминалу.
В таком случае
read может ждать ответ, хотя программа уже обработала запрос.Ещё одна особенность: дескрипторы
coproc не всегда доступны командам, запущенным как отдельные дочерние процессы. Для таких сценариев их можно предварительно продублировать через exec.▪️Как завершить работу
Закрываем канал записи и ждём завершения обработчика:
exec {WORKER[1]}>&-
wait "$WORKER_PID"После EOF цикл внутри обработчика завершится самостоятельно.
coproc удобен, когда нужен постоянный двусторонний обмен с процессом без сокетов, временных файлов и повторных запусков программы.BashTex 📱 #bash #linux