У меня есть программа, которая производит полезную информацию, 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