Mam program, który generuje przydatne informacje, stdout
ale także czyta z stdin
. Chcę przekierować standardowe wyjście do pliku, nie udostępniając niczego na standardowym wejściu. Jak dotąd tak dobrze: mogę zrobić:
program > output
i nie rób nic w tty.
Problem polega jednak na tym, że chcę to zrobić w tle. Jeśli zrobię:
program > output &
program zostanie zawieszony („zawieszony (wejście tty)”).
Jeśli zrobię:
program < /dev/null > output &
program kończy się natychmiast, ponieważ osiąga EOF.
Wydaje się, że potrzebuję połączyć się z program
czymś, co nie robi niczego przez czas nieokreślony i nie czyta stdin
. Działa następujące podejście:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Wszystko to jest jednak bardzo brzydkie. Tam ma być elegancki sposób, przy użyciu standardowych narzędzi systemu Unix, aby „nie robić nic, na czas nieokreślony” (parafrazując man true
). Jak mogłem to osiągnąć? (Moje główne kryteria elegancji tutaj: brak plików tymczasowych; brak zajętych oczekiwań lub okresowych pobudek; brak egzotycznych narzędzi; możliwie najkrótszy.)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
tego programu, wyjdziesz z programu?
su -c 'program | output &' user
. Zaraz zadam podobne pytanie dotyczące tworzenia zadań w tle jako akceptowalnej metody obsługi „usługi / demona”. Zauważyłem również, że nie mogę przekierowaćSTDERR
bez przekierowaniaSTDOUT
. Rozwiązanie, w którym program A wysyłaSTDOUT
doSTDIN
programu B, a następnie przekierowujeSTDERR
do pliku dziennika:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null