unix - Evita que FIFO cierre/reutilice FIFO cerrado
named-pipes eof (3)
Considere el siguiente escenario:
Se crea una test
nombre FIFO. 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 volver a iniciarlo y aún poder utilizar esta configuración como se sospecha. Sin embargo, si finaliza el proceso en la ventana B, B (por lo que sé) enviará un EOF a través del FIFO para procesar A y también lo terminará.
De hecho, si ejecuta un proceso que no termina en EOF, aún no podrá usar su FIFO que redirigió al proceso. Lo cual creo que 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 que se ejecuta en una sesión de pantalla. Por ejemplo: echo "command" >FIFO_to_server
. Probablemente sea posible hacerlo usando la pantalla por sí misma, pero no me siento muy cómodo con la pantalla. Creo que una solución que use solo tuberías sería más simple y más limpia.
A está leyendo de un archivo. Cuando llega al final del archivo, deja de leer. Este es un comportamiento normal, incluso si el archivo resulta ser un fifo. Ahora tienes cuatro enfoques.
- Cambie el código del lector para que siga leyendo después del final del archivo. Eso significa que el archivo de entrada es infinito, y llegar al final del archivo es solo una ilusión. No es práctico para ti, porque tendrías que cambiar el código del servidor de Minecraft.
Aplicar la filosofía unix. Tienes un escritor y un lector que no están de acuerdo con el protocolo, por lo que interpones una herramienta que los conecta. Da la casualidad de que existe una herramienta de este tipo en la caja de herramientas de Unix:
tail -f
.tail -f
sigue leyendo desde su archivo de entrada incluso después de ver el final del archivo. Haga que todos sus clientes hablen a la tubería y conectetail -f
al servidor de Minecraft:tail -n +1 -f client_pipe | minecraft_server &
Como lo mencionó jilles , usa un truco: los tubos admiten múltiples escritores, y solo se cierran cuando el último escritor desaparece. Así que asegúrate de que haya un cliente que nunca se vaya.
while true; do sleep 999999999; done >client_pipe &
El problema es que el servidor está diseñado fundamentalmente para manejar un solo cliente. Para manejar múltiples clientes, debes cambiar a usar un socket. Piense en los sockets como “meta-tuberías”: la conexión a un socket crea una tubería, y una vez que el cliente se desconecta, esa tubería en particular se cierra, pero el servidor puede aceptar más conexiones. Este es el enfoque limpio, porque también garantiza que no se mezclarán los datos si dos clientes se conectan al mismo tiempo (al usar tuberías, sus comandos podrían estar entremezclados). Sin embargo, requiere cambiar el servidor de minecraft.
Inicie un proceso que mantenga abierto el fifo para la escritura y que se ejecute indefinidamente. Esto evitará que los lectores vean una condición de fin de archivo.
Puede agregar múltiples entradas en una tubería agregando lo que necesita entre paréntesis con punto y coma en su ''mkfifo yourpipe'':
(cat file1; cat file2; ls -l;) > yourpipe