Saya memiliki program yang menghasilkan informasi bermanfaat stdouttetapi juga membaca dari stdin. Saya ingin mengarahkan output standarnya ke file tanpa memberikan apa pun pada input standar. Sejauh ini, sangat bagus: Saya bisa melakukan:
program > output
dan jangan melakukan apa pun di tty.
Namun, masalahnya adalah saya ingin melakukan ini di latar belakang. Jika aku melakukan:
program > output &
program akan ditangguhkan ("ditangguhkan (tty input)").
Jika aku melakukan:
program < /dev/null > output &
program berakhir segera karena mencapai EOF.
Tampaknya apa yang saya butuhkan adalah menyalurkan ke programsesuatu yang tidak melakukan apa pun untuk waktu yang tidak terbatas dan tidak membaca stdin. Pendekatan berikut bekerja:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Namun, ini semua sangat jelek. Ada memiliki menjadi cara yang elegan, menggunakan standar utilitas Unix, untuk "melakukan apa-apa, tanpa batas" (untuk parafrase man true). Bagaimana saya bisa mencapai ini? (Kriteria utama saya untuk keanggunan di sini: tidak ada file sementara; tidak ada sibuk menunggu atau bangun berkala; tidak ada utilitas eksotis; sesingkat mungkin.)
su -c 'while true; do true; done | cat > ~/output &' user?
1<&-itu akan keluar dari program Anda?
su -c 'program | output &' user. Saya akan mengajukan pertanyaan serupa dengan menciptakan pekerjaan latar belakang sebagai metode yang dapat diterima untuk menangani "layanan / daemon." Saya juga memperhatikan bahwa saya tidak bisa mengarahkan ulangSTDERRtanpa juga mengarahkan ulangSTDOUT. Solusi tempat programA mengirimSTDOUTkeSTDINprogramB, lalu mengalihkanSTDERRke file log:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null