Saya memiliki program yang menghasilkan informasi bermanfaat stdout
tetapi 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 program
sesuatu 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 ulangSTDERR
tanpa juga mengarahkan ulangSTDOUT
. Solusi tempat programA mengirimSTDOUT
keSTDIN
programB, lalu mengalihkanSTDERR
ke file log:programA 2> /var/log/programA.log | programB 2> /var/log/programB.log 1> /dev/null