J'ai un programme qui produit des informations utiles sur stdout
mais lit également stdin
. Je veux rediriger sa sortie standard vers un fichier sans rien fournir en entrée standard. Jusqu'ici, tout va bien: je peux faire:
program > output
et ne fais rien dans le tty.
Cependant, le problème est que je veux le faire en arrière-plan. Si je fais:
program > output &
le programme sera suspendu ("suspendu (entrée tty)").
Si je fais:
program < /dev/null > output &
le programme se termine immédiatement car il atteint EOF.
Il me semble que ce dont j'ai besoin, c'est de pénétrer dans program
quelque chose qui ne fait rien pendant une durée indéterminée et qui ne lit pas stdin
. Les approches suivantes fonctionnent:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Cependant, tout cela est très moche. Il doit y avoir un moyen élégant, en utilisant les utilitaires Unix standard, de "ne rien faire, indéfiniment" (pour paraphraser man true
). Comment pourrais-je y parvenir? (Mes principaux critères d'élégance sont les suivants: pas de fichiers temporaires, pas de files d'attente trop fréquentes ni de réveils périodiques; pas de services publics exotiques; aussi court que possible.)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
il va quitter votre programme?
su -c 'program | output &' user
. Je suis sur le point de poser une question similaire avec la création de tâches en arrière-plan en tant que méthode acceptable pour gérer un "service / démon". J'ai aussi remarqué que je ne pouvais pas redirigerSTDERR
sans rediriger égalementSTDOUT
. La solution où programmeA envoieSTDOUT
à programmeBSTDIN
, puis redirigeSTDERR
vers un fichier journal:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null