Ho un programma che produce informazioni utili stdout
ma che legge anche stdin
. Voglio reindirizzare il suo output standard su un file senza fornire nulla sull'input standard. Fin qui tutto bene: posso fare:
program > output
e non fare nulla nel tty.
Tuttavia, il problema è che voglio farlo in background. Se lo faccio:
program > output &
il programma verrà sospeso ("sospeso (input tty)").
Se lo faccio:
program < /dev/null > output &
il programma termina immediatamente perché raggiunge EOF.
Sembra che ciò di cui ho bisogno sia convogliare program
qualcosa che non fa nulla per un tempo indefinito e che non legge stdin
. I seguenti approcci funzionano:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Tuttavia, è tutto molto brutto. Ci deve essere un modo elegante, utilizzando le utility Unix standard, a "non fare nulla, a tempo indeterminato" (parafrasando man true
). Come ho potuto raggiungere questo obiettivo? (I miei criteri principali per l'eleganza qui: nessun file temporaneo; nessuna attesa in attesa o riattivazione periodica; nessuna utilità esotica; il più breve possibile.)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
esso uscirà dal tuo programma?
su -c 'program | output &' user
. Sto per porre una domanda simile con la creazione di lavori in background come metodo accettabile per la gestione di un "servizio / demone". Ho anche notato che non potevo reindirizzareSTDERR
senza reindirizzareSTDOUT
. La soluzione a cui programmaA inviaSTDOUT
aSTDIN
di programmaB, quindi reindirizzaSTDERR
a un file di registro:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null