
Tengo dos procesos y una canalización con nombre.
Un proceso lee activamente desde la tubería y un proceso envía datos a la tubería continuamente.
El comando que envía a la tubería es el siguiente:
sudo iotop -b -P > diskfifo
Por otro lado, el lector simplemente realiza una operación de lectura en bucle en la tubería.
pipe=./diskfifo
while read line <$pipe
do
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line
done
Problema: el comando iotop a veces se detiene después de un cierto número de iteraciones y no puedo entender por qué.
Sin embargo, noté que si reduzco la cantidad de datos enviados, el comando iotop no se detiene.
Respuesta1
En cada iteración de su bucle, read
se abrirá la tubería para lectura, se leerá una línea de datos y luego se cerrará.
Si iotop
decide intentar escribir en la tubería mientras read
no está leyendo activamente en ella, recibirá una PIPE
señal, ya que intenta escribir en una tubería desde la que nadie está leyendo. La acción predeterminada al recibir la PIPE
señal es finalizar el proceso.
En lugar de abrir y cerrar la tubería para leer en el bucle (y esperar que iotop
no se escriba en la tubería mientras no se lee), redirija la entrada de la tubería al bucle mismo:
pipe=./diskfifo
while read word; do
[ "$word" = 'quit' ] && break
printf '%s\n' "$word"
done <"$pipe"
Esto mantendría la tubería abierta durante todo el ciclo. Cada invocación de read
heredaría su flujo de entrada estándar de la entrada estándar del bucle, que está conectado a la tubería.
Una posible otra formulación del bucle:
while read word && [ "$word" != 'quit' ]; do
printf '%s\n' "$word"
done <"$pipe"