Apakah ada cara untuk mencegah pembekuan tmux ketika banyak teks di-output ke terminal?

38

Dalam sesi tmux di dalam xterm ketika sebuah program menghasilkan banyak ouput (seperti cat very_long_fileseluruh sesi dibekukan untuk sementara waktu. Bahkan jika saya menekan Ctrl-C tidak ada yang terganggu. Mungkin karena tmux dibekukan dan tidak meneruskan Ctrl-C ke program menghasilkan output. Apakah ada cara untuk mencegahnya?

ecerulm
sumber
Masalahnya adalah bahwa program menulis outputnya ke standar jauh lebih cepat daripada yang bisa ditampilkan oleh terminal Anda. Ketika Anda menekan Ctrl-C, prosesnya memang mati, tetapi terminal Anda terus mencetak output buffered.
chepner
1
Panel tmux pemisahan horizontal (yaitu Cb%) jauh lebih sensitif terhadap masalah ini daripada panel penuh atau panel split vertikal. Juga, menjalankan Cb d dan memasang kembali akan "mencairkan" program, meskipun hanya sementara. Sebenarnya tidak ada solusi kecuali Anda mau menggali ke dalam konfigurasi tmux.
RussellStewart

Jawaban:

15

Solusi yang benar adalah dengan melihat opsi c0- * untuk tmux untuk mencoba dan menilai-membatasi output. Alasan masalah ini ada sama sekali adalah karena data yang dikirim ke terminal lebih cepat daripada yang bisa menampilkannya, sehingga pembatasan tingkat adalah satu-satunya cara.

ThomasAdam
sumber
c0-change-trigger dan c0-change-interval tampaknya menyelesaikan masalah. Pengaturan default sudah cukup untuk saya.
ecerulm
setw -g c0-change-interval 100dan setw -g c0-change-trigger 250tidak membuat perbedaan bagi saya. Saya menggunakan tmux-1.8. Apakah saya melakukan sesuatu yang salah?
solotim
@solotim Bekerja pada tmux 1.9a saya, namun saya menambahkannya set-window-option -g ...ke .tmux.conf.
Polym
5
Rupanya, ini telah dihapus di tmux 2.2. :(
Martin C. Martin
20

Saya masih memiliki masalah ini di tmux 1.6-2 di Ubuntu 12.10. Salah satu solusi yang saya temukan adalah untuk keluar dari sesi (awalan + d) dan kemudian pasang kembali ( tmux attach, kandidat yang baik untuk alias shell cepat). Sepertinya tmux sebenarnya responsif di bawah tenda --- Anda dapat mengonfirmasi bahwa proses Anda benar-benar langsung dimatikan dengan ctrl-c --- hanya gambar yang menghalangi. Detatch berfungsi segera, dan ketika Anda memasang kembali, gambar akan dilewati sampai akhir.

Jack O'Connor
sumber
Penanganan yang baik. Tampaknya pada kenyataannya semuanya bekerja, bahkan beralih di antara pemisahan, hanya saja tidak bisa ditarik.
jmiserez
1
Ini seharusnya tmux attach, bukan?
pandubear
Ups, Anda benar. Tetap.
Jack O'Connor
2
Dan jika Anda tidak dapat melepaskan, misalnya tidak yakin dengan makro, cukup buka jendela terminal baru dan tmux attach.
mahemoff
5

Sejauh yang saya tahu tidak ada cara untuk mencegahnya dalam rilis saat ini tetapi beberapa pekerjaan sedang berlangsung. Anda dapat menemukan beberapa tambalan di milis tmux http://thread.gmane.org/gmane.comp.terminal-emulators.tmux.user/2689 .

Kata kunci yang baik untuk mencari di web adalah "flow control".

piec
sumber
2
mengapa tambalan tidak divalidasi di cabang utama? masalah ini adalah alasan paling penting saya masih menggunakan gnu_screen.
solotim
5

Sayangnya opsi c0- * untuk pembatasan tingkat telah dihapus pada tmux versi 2.1 ( changelog ). Sejauh yang saya tahu, satu-satunya cara untuk menyesuaikan pembatasan tingkat adalah memperbarui variabel yang mempengaruhinya dalam kode sumber (tmux.h):

" READ_SIZE adalah ukuran maksimum data yang dapat ditampung dari pty (event watermark tinggi). READ_BACKOFF adalah jumlah data yang menunggu untuk di-output ke tty sebelum pty dibaca akan dibatalkan. READ_TIME adalah berapa lama untuk mundur sebelum baca selanjutnya (dalam mikrodetik) jika tty di atas READ_BACKOFF. "

Di mana Anda akan menemukan default: (pada tmux v2.2):

#define READ_SIZE 1024
#define READ_BACKOFF 512
#define READ_TIME 100
Injil
sumber
1
Dalam tmux v2.3 variabel yang ditunjukkan tidak ada.
bergercookie
4

Jawabannya https://superuser.com/a/589896/311481 berfungsi dengan baik. Saya menggunakan nilai-nilai berikut:

setw -g c0-change-trigger 10
setw -g c0-change-interval 250

Kiat lain: jika Anda menggunakan ssh di dalam tmux, gunakan mosh sebagai gantinya: http://mosh.mit.edu/ Berperilaku lebih cerdas untuk menampilkan keluaran program. Ia mencoba untuk menampilkan keadaan layar terakhir menjatuhkan perantara jika diperlukan. Jadi tmux tidak akan pernah membeku jika banyak output yang dihasilkan di dalam panel dengan sesi mosh di dalamnya.

Tidak seperti SSH, protokol berbasis UDP mosh menangani kehilangan paket dengan anggun, dan menetapkan kecepatan bingkai berdasarkan kondisi jaringan. Mosh tidak mengisi buffer jaringan, jadi Control-C selalu bekerja untuk menghentikan proses pelarian.

Karena SSP [State Synchronization Protocol yang digunakan mosh] bekerja pada layer objek dan dapat mengontrol laju sinkronisasi (dengan kata lain, frame rate), ia tidak perlu mengirim setiap byte yang diterimanya dari aplikasi. Itu berarti Mosh dapat mengatur frame agar tidak mengisi buffer jaringan, mempertahankan respon dari koneksi dan memastikan Control-C selalu bekerja dengan cepat. Protokol yang harus mengirim setiap byte tidak dapat melakukan ini.

pengguna2683246
sumber
0

Coba emulator terminal yang berbeda. Pada RedHat 6.5, konsole (KDE) tidak memiliki masalah pembekuan (tmux 2.3 dan master); Namun, xterm dan terminal gnome keduanya mengalami pembekuan yang buruk.

kko
sumber
tmux 2.2 bekerja dengan baik tanpa masalah pembekuan pada ketiga emulator terminal.
kko