У мене є програма, яка видає корисну інформацію про, 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
доSTDIN
programB, потім перенаправляєSTDERR
до файлу журналу:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null