Tengo un programa que produce información útil stdout
pero también lee 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 que 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. No tiene que ser una manera elegante, con las utilidades estándar de Unix, "no hacer nada, por tiempo indefinido" (parafraseando 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 corto posible).
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
él, ¿saldrá de su programa?
su -c 'program | output &' user
. Estoy a punto de hacer una pregunta similar con la creación de trabajos en segundo plano como un método aceptable para manejar un "servicio / demonio". También noté que no podía redirigirSTDERR
sin también redirigirSTDOUT
. La solución en la que programą envíaSTDOUT
aSTDIN
de programB, a continuación, vuelve a dirigirSTDERR
a un archivo de registro:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null