← retour aux snippets

bash coproc: paralléliser avec des coprocesseurs

Utiliser coproc pour gérer des producteurs/consommateurs asynchrones dans un script.

bash process #bash#coproc#async

objectif

Traiter des flux en parallèle sans gestion complexe de threads ou de files.

code minimal

# démarre un coprocesseur qui upper-case l'entrée
coproc UP { tr '[:lower:]' '[:upper:]'; }
printf 'data.pm\n' >&"${UP[1]}"
read -r out <&"${UP[0]}"
echo "$out"  # DATA.PM

utilisation

# pipeline asynchrone avec timeouts
coproc WORK { while read -r line; do echo "ok:$line"; done; }
while read -r x; do
  printf '%s
' "$x" >&"${WORK[1]}"
done < input.txt
exec {WORK[1]}>&-  # fermer l'entrée
timeout 2 cat <&"${WORK[0]}" || echo "timeout"

variante(s) utile(s)

# plusieurs coprocesseurs
coproc A { sed 's/foo/bar/g'; }
coproc B { awk '{print NR":"$0}'; }

notes

  • coproc crée des descripteurs ${NAME[0]} (lecture) et ${NAME[1]} (écriture).
  • pensez à fermer les descripteurs pour éviter des blocages.