У мене є програма, яка видає корисну інформацію про, stdoutале і читає з неї stdin. Я хочу перенаправити його стандартний вихід у файл, не надаючи нічого на стандартний вхід. Поки так добре: я можу:
program > output
і нічого не робити в tty.
Однак проблема полягає в тому, що я хочу це зробити у фоновому режимі. Якщо я:
program > output &
програма буде призупинена ("призупинено (вхід tty)").
Якщо я:
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. Я збираюся задати аналогічне запитання зі створенням фонових завдань як прийнятного методу обробки "послуги / демон". Я також зауважив, що не можу переадресувати,STDERRне переспрямувавшисьSTDOUT. Рішення, де programA надсилаєSTDOUTдоSTDINprogramB, потім перенаправляєSTDERRдо файлу журналу:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null