GNU/Linux >> Belajar Linux >  >> Linux

Mengapa saya tidak bisa `tail -f /proc/$pid/fd/1`?

Buat strace dari tail -f , itu menjelaskan segalanya. 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 fungsinya? Ini menyiapkan inotify handler ke file, dan kemudian menunggu sampai terjadi sesuatu dengan file ini. Jika kernel mengatakan tail melalui inotify handler ini, bahwa file berubah (biasanya, ditambahkan), lalu tail 1) mencari 2) membaca perubahan 3) menuliskannya ke layar.

/proc/3844/fd/1 di sistem Anda adalah tautan simbolis ke /dev/pts/14 , yang merupakan perangkat karakter. Tidak ada yang namanya "peta memori", yang dapat diakses oleh itu. Jadi, tidak ada perubahan yang dapat ditandatangani ke inotify, karena tidak ada disk atau area memori yang dapat diakses olehnya.

Perangkat karakter ini adalah terminal virtual, yang secara praktis bekerja seolah-olah itu adalah soket jaringan. Program yang berjalan di terminal virtual ini terhubung ke perangkat ini (sama seperti jika Anda melakukan 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 menonton terminal virtual. Ini dapat dilakukan di linux, tetapi tidak sesederhana itu, memerlukan beberapa fungsi seperti proxy jaringan, dan sedikit penggunaan yang rumit dari ioctl() ini panggilan. Tapi ada alat yang bisa melakukan itu.

Saat ini saya tidak dapat mengingat, paket debian mana yang memiliki alat untuk tujuan ini, tetapi dengan sedikit googling Anda mungkin dapat menemukannya dengan mudah.

Ekstensi: seperti yang disebutkan @Jajesh di sini (beri dia +1 jika Anda memberi saya), alat ini bernama watch .

Ekstensi #2: @kelnos menyebutkan, cat /dev/pts/14 sederhana juga cukup. Saya mencobanya, dan ya, berhasil, tetapi tidak benar. Saya tidak banyak bereksperimen dengan itu, tetapi bagi saya sepertinya output yang masuk ke terminal virtual itu hilang juga ke cat perintah, atau ke lokasi aslinya, dan tidak pernah ke keduanya. Tapi itu tidak pasti.


File dalam /dev/pts bukan file biasa, mereka adalah pegangan untuk terminal virtual.A pts perilaku untuk membaca dan menulis tidak simetris (yaitu, apa yang tertulis di sana nantinya dapat dibaca darinya, seperti file biasa atau fifo/pipa), tetapi dimediasi oleh proses yang membuat terminal virtual:beberapa yang umum adalah xterm atau ssh atau agetty atau layar. Proses pengontrolan biasanya akan mengirimkan penekanan tombol ke proses yang membaca pts file, dan tampilkan di layar apa yang mereka tulis di pts .

Jadi, tail -f /dev/pts/14 akan mencetak kunci yang Anda ketuk di terminal tempat Anda memulai skrip, dan jika Anda melakukan echo meh > /dev/pts/14 meh pesan akan muncul di terminal.


Linux
  1. Linux – Bagaimana Cara Membaca Dari /proc/$pid/mem Di Linux?

  2. Bash =~ Regex Dan Https://regex101.com/?

  3. Linux – /proc/pid/fd/x Nomor Tautan?

  1. Mengapa mencetak ke stdout sangat lambat? Apakah bisa dipercepat?

  2. /proc/[pid]/pagemaps dan /proc/[pid]/maps | linux

  3. Bagaimana cara mengetahui dari folder mana suatu proses sedang berjalan?

  1. Mengapa begitu banyak /dev/tty di Linux?

  2. Mengapa saya tidak bisa menggulir di terminal?

  3. Mengapa meletakkan hal-hal selain /home ke partisi terpisah?