Make a strace
of tail -f
, itu menjelaskan semuanya. Bagian yang menarik:
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 fstatfs(3, {...}) = 0
13791 inotify_init() = 4
13791 inotify_add_watch(4, "/path/to/file", IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1
13791 fstat(3, {st_mode=S_IFREG|0644, st_size=139, ...}) = 0
13791 read(4, 0xd981c0, 26) = -1 EINTR (Interrupted system call)
Apa itu? Ini mengatur inotify
penangan ke file, dan kemudian menunggu sampai terjadi sesuatu dengan file ini. Jika kernel mengatakan tail
melalui penangan inotify ini, bahwa file berubah (biasanya ditambahkan), maka tail
1) mencari 2) membaca perubahan 3) menuliskannya ke layar.
/proc/3844/fd/1
pada sistem Anda adalah tautan simbolis ke /dev/pts/14
, yang merupakan perangkat karakter. Tidak ada yang namanya "peta memori", yang bisa diakses dengan itu. Dengan demikian, tidak ada perubahan yang dapat ditandatangani ke inotify, karena tidak ada area disk atau memori yang dapat diakses oleh itu.
Perangkat karakter ini adalah terminal virtual, yang secara praktis berfungsi seolah-olah itu adalah soket jaringan. Program yang berjalan di terminal virtual ini terhubung ke perangkat ini (seperti jika Anda telnet-ted ke port tcp), dan menulis apa yang ingin mereka tulis. Ada hal-hal yang lebih kompleks juga, misalnya mengunci layar, urutan kontrol terminal dan semacamnya, ini biasanya ditangani oleh ioctl()
panggilan.
Saya pikir, Anda ingin entah bagaimana menonton terminal virtual. Ini dapat dilakukan di linux, tetapi tidak begitu sederhana, perlu beberapa fungsionalitas seperti proxy jaringan, dan sedikit penggunaan ioctl()
panggilan ini yang rumit . Tetapi ada alat yang bisa melakukan itu.
Saat ini saya tidak ingat, paket debian mana yang memiliki alat untuk tujuan ini, tetapi dengan sedikit googling Anda dapat menemukannya dengan mudah.
Ekstensi: seperti yang disebutkan @Jajesh di sini (beri dia +1 jika Anda memberi saya), alat ini dinamai watch
.
Extension # 2: @kelnos menyebutkan, simpel cat /dev/pts/14
juga cukup. Saya mencobanya, dan ya, itu berhasil, tetapi tidak dengan benar. Aku tidak bereksperimen banyak dengan itu, tetapi tampaknya seolah output akan menjadi yang terminal virtual pergi baik dengan cat
perintah, atau ke lokasi semula, dan tidak pernah keduanya. Tapi itu tidak pasti.