Saya menulis sebuah skrip sederhana yang echo
merupakan PID-nya:
#/bin/bash
while true; do
echo $$;
sleep 0.5;
done
Saya menjalankan skrip tersebut (dikatakan 3844
berulang kali) di satu terminal dan mencoba ke tail
deskriptor file di terminal lain:
$ tail -f /proc/3844/fd/1
Itu tidak mencetak apa pun ke layar dan hang sampai ^c
. Mengapa?
Juga, semua deskriptor file STD (IN / OUT / ERR) tautan ke Poin yang sama:
$ ls -l /proc/3844/fd/
total 0
lrwx------ 1 mg mg 64 sie 29 13:42 0 -> /dev/pts/14
lrwx------ 1 mg mg 64 sie 29 13:42 1 -> /dev/pts/14
lrwx------ 1 mg mg 64 sie 29 13:42 2 -> /dev/pts/14
lr-x------ 1 mg mg 64 sie 29 13:42 254 -> /home/user/test.sh
lrwx------ 1 mg mg 64 sie 29 13:42 255 -> /dev/pts/14
Apakah ini normal?
Menjalankan Ubuntu GNOME 14.04.
Jika menurut Anda pertanyaan ini milik SO atau SU dan bukan UL, katakan.
linux
bash
proc
file-descriptors
cprn
sumber
sumber
Jawaban:
Make a
strace
oftail -f
, itu menjelaskan semuanya. Bagian yang menarik:Apa itu? Ini mengatur
inotify
penangan ke file, dan kemudian menunggu sampai terjadi sesuatu dengan file ini. Jika kernel mengatakantail
melalui penangan inotify ini, bahwa file berubah (biasanya ditambahkan), makatail
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 dengancat
perintah, atau ke lokasi semula, dan tidak pernah keduanya. Tapi itu tidak pasti.sumber
tail
itu benar (arloji yang tidak berlaku), tetapi dia salah karena sebenarnya sangat sederhana untuk melakukan apa yang Anda inginkan: cukup gunakancat
sajatail
.cat
tidak bekerja untuk saya juga, itu menggantung dengan cara yang sama tidak dan yang bisa saya lakukan adalah melakukannyactrl+c
.echo $$
untukecho $$ >> foo
jadi sekarang ada file dan proses membukanya dan menambahkan untuk itu setiap 0,5 detik. Saya masih tidak dapat mengaksesnya melalui deskriptor file dan semua deskriptor file di/proc/$pid/fd/
(tetapi 254 yang terhubung ketest.sh
skrip itu sendiri)/dev/pts/14
. Bagaimana cara bash mengaksesnyafoo
?File dalam
/dev/pts
bukan file biasa, mereka menangani untuk terminal virtual. Sebuahpts
perilaku untuk membaca dan menulis tidak simetris (yaitu, apa yang tertulis di sana nantinya dapat membaca dari itu, seperti file biasa atau FIFO / pipa), tetapi dimediasi oleh proses yang menciptakan terminal virtual: beberapa yang umum adalah xterm atau ssh atau agetty atau layar. Proses pengendalian biasanya akan mengirimkan penekanan tombol ke proses yang membacapts
file, dan menampilkan apa yang mereka tulis di layarpts
.Dengan demikian,
tail -f /dev/pts/14
akan mencetak kunci Anda tekan pada terminal dari mana Anda mulai naskah Anda, dan jika Anda melakukannyaecho meh > /dev/pts/14
denganmeh
pesan akan muncul di terminal.sumber
tail -f /dev/pts/14
tidak mencetak tombol yang saya ketuk pada terminal itu. Itu jawaban yang menarik. Terima kasih.Beberapa waktu yang lalu saya menemukan agak atasi bahwa kadang-kadang menjawab kebutuhan untuk memeriksa apa yang sedang dikeluarkan ke STDOUT, dengan asumsi Anda memiliki
pid
proses dan Anda dapat telanjang mata hasil tidak ramah:sumber
Saya kira, untuk ini daripada membuntuti, apa yang perlu Anda lakukan adalah menonton hasilnya.
Semoga ini yang Anda butuhkan.
sumber
watch
. Apa yang saya coba lakukan adalah mengintip output dari proses yang sudah berjalan, jadiwatch
tidak membantu.