El proceso se cierra inesperadamente al enviar a una canalización con nombre

El proceso se cierra inesperadamente al enviar a una canalización con nombre

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, readse abrirá la tubería para lectura, se leerá una línea de datos y luego se cerrará.

Si iotopdecide intentar escribir en la tubería mientras readno está leyendo activamente en ella, recibirá una PIPEseñal, ya que intenta escribir en una tubería desde la que nadie está leyendo. La acción predeterminada al recibir la PIPEseñal es finalizar el proceso.

En lugar de abrir y cerrar la tubería para leer en el bucle (y esperar que iotopno 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 readheredarí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"

información relacionada