Eu tenho um programa que produz informações úteis, stdout
mas também lê stdin
. Quero redirecionar sua saída padrão para um arquivo sem fornecer nada na entrada padrão. Até agora, tudo bem: eu posso fazer:
program > output
e não faça nada no tty.
No entanto, o problema é que eu quero fazer isso em segundo plano. Se eu fizer:
program > output &
o programa será suspenso ("suspendido (entrada tty)").
Se eu fizer:
program < /dev/null > output &
o programa termina imediatamente porque alcança EOF.
Parece que o que preciso é canalizar para program
algo que não faz nada por um período indefinido de tempo e não lê stdin
. As abordagens a seguir funcionam:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
No entanto, tudo isso é muito feio. Não tem que ser uma maneira elegante, usando utilitários Unix padrão, para "não fazer nada, por tempo indeterminado" (parafraseando man true
). Como eu consegui isso? (Meus principais critérios de elegância aqui: sem arquivos temporários; sem espera ocupada ou ativações periódicas; sem utilitários exóticos; o mais curto possível).
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
ele sairá do seu programa?
su -c 'program | output &' user
. Estou prestes a fazer uma pergunta semelhante com a criação de trabalhos em segundo plano como um método aceitável para lidar com um "serviço / daemon". Também notei que não era possível redirecionarSTDERR
sem também redirecionarSTDOUT
. A solução onde o Programa enviaSTDOUT
aSTDIN
de programB, então redirecionaSTDERR
para um arquivo de log:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null