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.