TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.51K subscribers
Post #349 1.23K
Использование coproc для работы с асинхронными потоками

Многие знают про & и wait, но есть куда более элегантный инструмент для асинхронной работы - coproc. Это встроенная команда, которая запускает процесс в фоне и автоматически подключает к нему двусторонний канал (pipe).

❓ Как это работает

coproc создает процесс, у которого:

stdin доступен через дескриптор ${COPROC[1]} (запись в процесс);
stdout доступен через ${COPROC[0]} (чтение из процесса);
имя coproc можно задавать, чтобы управлять несколькими одновременно.


▪️ Простейший пример


#!/bin/bash

# Запускаем фоновый bc как "асинхронный калькулятор"
coproc CALC { bc -l; }

# Отправляем в stdin команды
echo "2+3" >&"${CALC[1]}"
echo "s(1)" >&"${CALC[1]}"

# Читаем ответы из stdout
read -u "${CALC[0]}" result1
read -u "${CALC[0]}" result2

echo "Результат 1: $result1"
echo "Результат 2: $result2"


Процесс bc живет, пока вы его не закроете. То есть можно посылать команды и читать ответы несколько раз.

▪️ Практические кейсы
📍 Асинхронные задачи с обратной связью. Можно запускать ping, tcpdump или tail -f в coproc, а потом считывать поток строк построчно:


coproc PINGER { ping -O 8.8.8.8; }
while read -ru "${PINGER[0]}" line; do
echo "PING: $line"
done


📍 Фоновый обработчик. Например, пишем строки в процессинг-скрипт:


coproc HANDLER { while read line; do echo ">> $line"; done; }
echo "Hello" >&"${HANDLER[1]}"
echo "World" >&"${HANDLER[1]}"


📍 Несколько процессов. Coproc можно называть:


coproc P1 { ping -c2 8.8.8.8; }
coproc P2 { ping -c2 1.1.1.1; }


▪️ Подводные камни

Каналы буферизуются, иногда нужно sleep или stdbuf -oL для построчной работы.
Закрывайте дескрипторы exec {fd}>&-, иначе процесс может висеть.
coproc работает только в bash ≥ 4.


BashTex 📱 #bash #utils
  • 👍 8
More from @bash_tex
  1. Oct 9, 2026BashTex 📱 #мем
  2. Oct 8, 2026Bridge FDB - как Linux bridge узнаёт, где находится MAC Linux bridge не знает заранее, за…
  3. Oct 7, 2026/dev/tcp - сетевое соединение средствами Bash В Bash есть малоизвестная возможность работа…
  4. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  5. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  6. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
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 →