Faydalı bilgiler üreten stdout
ama aynı zamanda okuyan bir program var stdin
. Standart çıktıda hiçbir şey sağlamadan standart çıktısını bir dosyaya yönlendirmek istiyorum. Şimdiye kadar, çok iyi: Yapabilirim:
program > output
ve tty içinde hiçbir şey yapmayın.
Ancak sorun şu ki bunu arka planda yapmak istiyorum. Eğer yaparsam:
program > output &
program askıya alınacaktır ("askıya alınmış (tty girişi)").
Eğer yaparsam:
program < /dev/null > output &
Program EOF'a ulaştığı için derhal sona erer.
İhtiyacım program
olan şey, belirsiz bir süre boyunca hiçbir şey yapmayan ve okumayan bir şeye bağlanmak stdin
. Aşağıdaki yaklaşımlar işe yarar:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Ancak, bu hepsi çok çirkin. Orada sahiptir (tefsir "süresiz, hiçbir şey yapmak" için, standart Unix araçları kullanılarak, zarif bir yolu olmalı man true
). Bunu nasıl başarabilirim? (Buradaki zarafet için temel kriterlerim: geçici dosyalar yok, meşgul beklemede veya periyodik uyandırmalar; egzotik araçlar yok; mümkün olduğunca kısa.)
su -c 'while true; do true; done | cat > ~/output &' user
?
1<&-
programdan çıkacağını varsayıyorum ?
su -c 'program | output &' user
. Benzer bir soruyu, bir "hizmet / arka plan programı" işlemek için kabul edilebilir bir yöntem olarak arka plan işleri oluşturma konusunda sormak üzereyim. Ayrıca, yönlendirmedenSTDERR
de yönlendirme yapamadığımı fark ettimSTDOUT
. Programa gönderir çözümSTDOUT
içinSTDIN
programB birleştirdikten sonra yönlendirirSTDERR
bir günlük dosyasına:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null