GNU/Linux >> Belajar Linux >  >> Linux

Membaca Terus Menerus Dari Pipa Bernama (cat Atau Ekor -f)?

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.


Linux
  1. Cara membuat kata sandi acak di linux menggunakan /dev/random

  2. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  3. Seberapa Portabel /dev/stdin, /dev/stdout Dan /dev/stderr?

  1. Cara memetakan perangkat /dev/sdX dan /dev/mapper/mpathY dari perangkat /dev/dm-Z

  2. Kapan saya harus menggunakan /dev/shm/ dan kapan saya harus menggunakan /tmp/?

  3. RdRand dari /dev/random

  1. membaca dari serial dari baris perintah linux

  2. Linux:Perbedaan antara /dev/console , /dev/tty dan /dev/tty0

  3. kernel:menonaktifkan /dev/kmem dan /dev/mem