en cuenta la situación siguiente:Prevenir FIFO de cierre/reutilización cerrado FIFO
un FIFO nombrado se crea test
. En una ventana de terminal (A) ejecuto cat <test
y en otra (B) cat >test
. Ahora es posible escribir en la ventana B y obtener la salida en la ventana A. También es posible finalizar el proceso A y reiniciarlo y aún así poder utilizar esta configuración como se sospecha. Sin embargo, si finaliza el proceso en la ventana B, B (hasta donde yo sé) enviará un EOF a través del FIFO para procesar A y finalizarlo también.
De hecho, si ejecuta un proceso que no termina en EOF, aún no podrá usar su FIFO que redireccionó al proceso. Lo cual creo es porque este FIFO se considera cerrado.
¿Hay alguna forma de evitar este problema?
La razón por la que me encontré con este problema es porque me gustaría enviar comandos a mi servidor de Minecraft ejecutándose en una sesión de pantalla. Por ejemplo: echo "command" >FIFO_to_server
. Esto es probablemente posible haciendo uso de la pantalla por sí mismo, pero no estoy muy cómodo con la pantalla. Creo que una solución que utiliza solo tuberías sería más simple y más limpia.
Desafortunadamente 'tail' espera EOF para que no pase el contenido de la tubería línea por línea. – pabouk
@pabouk Gracias por señalar este error: 'tail -n 1 -f' omitiría la entrada disponible antes de que comenzara o se pusiera a disposición más rápido de lo que podría leer.Quería escribir 'tail -n +1 -f', que comienza a emitirse directamente. – Gilles
Gracias. Lo he intentado antes, pero '-n + 1' no funcionó como esperaba. Ahora, como confirmó que esta es la manera correcta, examiné el problema más a fondo y me di cuenta de que el problema está en el almacenamiento en búfer de bloques (en lugar del búfer de línea predeterminado) de stdout de 'tail'. La solución para la tubería línea por línea: 'stdbuf -oL tail -n +1 -f client_pipe | command' – pabouk