У меня есть программа, которая производит полезную информацию, stdout
но также читает из stdin
. Я хочу перенаправить его стандартный вывод в файл, не предоставляя ничего для стандартного ввода. Пока все хорошо, я могу сделать:
program > output
и не делай ничего в tty.
Однако проблема в том, что я хочу сделать это в фоновом режиме. Если я сделаю:
program > output &
программа будет приостановлена («приостановлено (tty input)»).
Если я сделаю:
program < /dev/null > output &
программа немедленно завершается, потому что она достигает EOF.
Кажется, что мне нужно подключиться к program
чему-то, что ничего не делает в течение неопределенного времени и не читает stdin
. Работают следующие подходы:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Однако все это очень некрасиво. Там есть быть элегантным способом, с помощью стандартного утилита Unix, не «ничего не делать, до бесконечности» (перефразируя man true
). Как я мог этого добиться? (Мои главные критерии элегантности здесь: никаких временных файлов; никаких занятых или периодических пробуждений; никаких экзотических утилит; как можно короче.)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
ним, выйдет из вашей программы?
su -c 'program | output &' user
. Я собираюсь задать аналогичный вопрос с созданием фоновых заданий в качестве приемлемого метода для обработки «service / daemon». Я также заметил, что я не мог перенаправитьSTDERR
без перенаправленияSTDOUT
. Решение, в котором программа A отправляетSTDOUT
вSTDIN
программу B, а затем перенаправляетSTDERR
в файл журнала:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null