Saya telah mengonfigurasi rsyslog untuk mencatat log peristiwa tertentu ke /dev/xconsole :
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole adalah pipa bernama (fifo ). Jika saya ingin melihat apa yang sedang dicatat, saya dapat melakukan cat /dev/xconsole . Saya terkejut melihat, bahwa perintah cat /dev/xconsole tidak selesai setelah membaca file, tetapi bertindak sebagai tail -f . dengan kata lain, kedua perintah berperilaku sama:
cat /dev/xconsole
tail -f /dev/xconsole
Adakah yang bisa menjelaskan mengapa demikian?
Apakah ada perbedaan antara keduanya?
Jawaban yang Diterima:
cat terus membaca sampai mendapat EOF. Sebuah pipa menghasilkan EOF pada output hanya ketika mendapat EOF pada input. Daemon logging membuka file, menulis padanya, dan membiarkannya tetap terbuka — seperti halnya untuk file biasa — jadi EOF tidak pernah dihasilkan pada output. cat terus membaca, memblokir setiap kali menghabiskan apa yang ada di dalam pipa.
Anda dapat mencobanya sendiri secara manual:
$ mkfifo test
$ cat test
Dan di terminal lain:
$ cat > test
hello
Akan ada output di terminal lain. Kemudian:
world
Akan ada lebih keluaran di terminal lain. Jika Anda sekarang Ctrl-D inputnya maka cat lainnya akan berakhir juga.
Dalam hal ini, satu-satunya perbedaan yang dapat diamati antara cat dan tail -f akan terjadi jika daemon logging dihentikan atau dimulai ulang:cat akan berhenti secara permanen ketika ujung tulis pipa ditutup, tetapi tail -f akan terus berjalan (membuka kembali file) ketika daemon di-restart.