GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer nada para siempre de una manera elegante?

Tengo un programa que produce información útil sobre stdout pero también lee desde stdin . Quiero redirigir su salida estándar a un archivo sin proporcionar nada en la entrada estándar. Hasta ahora todo bien:puedo hacer:

program > output

y no hagas nada en el tty.

Sin embargo, el problema es que quiero hacer esto en segundo plano. Si lo hago:

program > output &

el programa se suspenderá ("suspendido (entrada tty)").

Si lo hago:

program < /dev/null > output &

el programa termina inmediatamente porque llega a EOF.

Parece que lo que necesito es conectarme a program algo que no hace nada por un tiempo indefinido y no lee stdin . Los siguientes enfoques funcionan:

while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &

Sin embargo, todo esto es muy feo. Hay tiene ser una forma elegante, utilizando las utilidades estándar de Unix, de “no hacer nada, indefinidamente” (parafraseando a man true ). ¿Cómo podría lograr esto? (Mi criterio principal para la elegancia aquí:sin archivos temporales, sin esperas ocupadas o despertares periódicos, sin utilidades exóticas, lo más breve posible).

Respuesta aceptada:

En shells que los admitan (ksh, zsh, bash4), puede iniciar program como un co-proceso.

  • ksh :program > output |&
  • zsh , bash :coproc program > output

Eso inicia program en segundo plano con su entrada redirigida desde un pipe . El otro extremo del tubo está abierto al caparazón.

Tres beneficios de ese enfoque

  • sin proceso adicional
  • puede salir del script cuando program muere (use wait esperarlo)
  • program terminará (obtener eof en su stdin si el shell sale).

Linux
  1. Cómo asignar la salida de un comando de Linux a una variable

  2. ¿Cómo ordenar la salida Du por tamaño?

  3. ¿Cómo redirigir la salida de un programa a un archivo zip?

  4. Cómo redirigir la salida del programa como su entrada

  5. tcpdump:¿cómo obtener una salida grepable?

Cómo guardar la salida del comando en un archivo en Linux

¿Cómo hacer que cualquier programa funcione con el comando Tee?

Cómo:Introducción a la programación - Control de flujo

Maneras brillantes de cómo ejecutar un programa en Linux

Cómo escribir y ejecutar un programa C en Linux

¿Cómo detener la salida de ping?