Masalah
Saya menjalankan perintah yang menghasilkan BANYAK informasi melalui SSH. Sebagai contoh, saya dengan bodohnya menambahkan informasi debug di dalam sebuah loop yang mengeksekusi jutaan kali, atau hanya menjalankan cat /dev/urandom
untuk tendangan.
Terminal dibanjiri informasi.
Saya ingin mengakhiri perintah ASAP dan memperbaiki program saya. Saya tidak peduli apa yang dicetaknya. Sekarang, masalahnya adalah saya menekan Ctrl+ CASAP (dalam contoh di atas saya menekannya segera setelah menjalankan perintah), tetapi masih butuh waktu untuk mencetak semua informasi yang bahkan tidak saya butuhkan .
Apa yang saya coba
Saya mencoba menekan Ctrl+ Csangat keras sehingga hasilnya lucu ketika terminal akhirnya menyusul:
OUTPUT HERE^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
^C^C
^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
^C^C^C^C^C^C^C^C^C^C^C^C^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
rr-@burza:~/xor$ ^C
Saya juga membaca tentang Ctrl+ Syang tampaknya digunakan untuk memberitahu terminal "hentikan output, saya perlu mengejar" tetapi ternyata tidak melakukan apa-apa.
Detail lain-lain
Saya ingin tidak mengubah perintah yang saya jalankan sehingga saya dapat menyelamatkan diri saya dalam situasi apa pun, bahkan jika saya tidak ingat bahwa program yang saya jalankan dapat berakhir seperti itu.
Klien SSH saya berjalan pada Cygwin ( CYGWIN_NT-6.1-WOW64 luna 1.7.30(0.272/5/3) 2014-05-23 10:36 i686 Cygwin
) di MinTTY dengan tipe terminal diatur ke xterm-256color
.
Server SSH berjalan pada Debian ( Linux burza 3.2.0-4-686-pae #1 SMP Debian 3.2.51-1 i686 i686 i686 GNU/Linux
).
Ctrl-O
, yang berarti "membuang semua output yang ditulis ke terminal ini".-j
opsi, untuk mengaktifkan scroll scrolling. Masalah mendasarnya adalah bahwa kendali jarak jauh dapat mengirim data lebih cepat daripada yang dapat ditampilkan oleh jendela terminal - secara default, ia harus menggertak isi jendela setiap kali baris baru dicetak. Seluruh banyak data dapat di-buffered pada saat Ctrl-C Anda diterima oleh sistem jarak jauh, dan program terminal Anda akan mencoba menampilkan semuanya..bashrc
?Jawaban:
Sebagian dari output itu akan di-buffer. Anda mengirim Ctrl+ Anda Cke ujung jarak jauh yang mengganggu program yang sedang berjalan. Program tersebut ada dan shell mengirim karakter untuk menunjukkan kepada Anda prompt lagi. Sebelum prompt ditampilkan, layar Anda akan terlebih dahulu menampilkan semua data yang disangga dan sudah ada di dekat Anda.
Yang Anda minta adalah agar program berhenti dan data dalam perjalanan entah bagaimana menghilang. Itu tidak bisa terjadi karena sudah dalam perjalanan.
Satu-satunya cara Anda dapat memastikan bahwa Anda tidak melihat data ini adalah keluar dari terminal di ujung Anda dan kemudian menyambung kembali ke remote Anda - tetapi itu mungkin jauh lebih banyak upaya daripada menunggu data buffered untuk ditampilkan.
sumber
Saya biasanya menjalankan output
less
sehingga saya dapat membunuhnya melaluiless
menggunakan qkunci.Contoh
Setelah menekan q+, Enteria akan berhenti dan kembali ke terminal normal Anda, membiarkannya bagus dan bersih.
Mengapa itu terjadi?
Masalah yang Anda temui adalah bahwa ada buffer (untuk STDOUT) yang sedang antri dengan output tampilan Anda. Buffer ini diisi dengan begitu cepat sehingga Anda tidak dapat menghentikannya dengan cukup cepat untuk menghentikannya.
Untuk menonaktifkan / membatasi efek ini, Anda dapat menonaktifkan buffer STDOUT yang seharusnya membuat hal-hal menjadi sedikit lebih responsif digunakan
stdbuf
, tetapi Anda mungkin harus bermain dengan pengaturan ini untuk mendapatkan hal-hal seperti yang Anda inginkan. Untuk membatalkan STDOUT Anda dapat menggunakan perintah ini:Halaman manual untuk
stdbuf
perincian opsi yang Anda inginkan:Untuk latar belakang yang bagus tentang cara kerja buffering, saya sangat menyarankan untuk melihat pada Beat Pixel yang diartikulasikan berjudul: buffering dalam stream standar . Itu bahkan termasuk gambar yang bagus.
Referensi
sumber
|less
kecmd
, yang sayangnya saya sering tidak. Jika Anda menjalankancmd
, Anda masih harus menunggu sampai selesai hasil pencetakan dihitung sebelum menerima^C
.Ada beberapa level buffering. Ketika Anda menekan Ctrl+ C, ini menghentikan program dari memancarkan data ke terminal. Ini tidak memengaruhi data yang belum ditampilkan oleh emulator terminal.
Saat Anda menampilkan data dengan kecepatan sangat tinggi, terminal tidak dapat mengikuti dan akan tertinggal. Itulah yang terjadi di sini: menampilkan teks jauh lebih mahal daripada menghasilkan angka acak ini. Ya, bahkan dengan font bitmap - menghasilkan angka acak berkualitas kriptografis sangat murah dibandingkan. (Saya baru saja mencoba pada mesin saya dan proses X menjenuhkan CPU, dengan
xterm
mengambil beberapa% dancat
(dimana generasi angka acak dihitung) hampir tidak mencapai 1%. Dan itu dengan font bitmap.)Jika Anda ingin ini berhenti sekarang, bunuh terminal emulator. Jika Anda tidak ingin melakukan itu, setidaknya perkecil jendela; emulator terminal cerdas (seperti xterm) tidak akan memetakan jendela, yang menghemat waktu CPU X, sehingga sampah akan selesai menampilkan lebih cepat. Server X memiliki prioritas tinggi, jadi ini akan membuat perbedaan besar pada respons mesin Anda saat xterm memproses data di latar belakang.
Ketika semua ini terjadi di shell jauh, lag bahkan lebih buruk, karena data yang dihasilkan
cat
harus terlebih dahulu melalui koneksi SSH. Pers Anda Ctrl+ Cjuga harus melalui koneksi SSH; itu mendapat prioritas yang agak lebih tinggi (itu dikirim keluar dari band), tetapi itu masih membutuhkan waktu di mana lebih banyak output menumpuk. Tidak ada cara untuk menekan data dalam perjalanan sebelum menutup koneksi SSH (yang dapat Anda lakukan dengan menekan Enteritu~.
).sumber
Ini harus cukup untuk menemukan cara untuk
kill
yangcat
perintah.Untuk proposal berikut, Anda mungkin perlu koneksi ssh kedua terbuka.
Jarang CTRL+zbisa lebih efektif daripada CTRL+c: ia bisa menjawab lebih cepat. Setelah itu Anda menangguhkan perintah Anda dapat membunuhnya dengan
kill %1
atau apa pun nomor pekerjaannya.Ini dengan harapan bahwa Anda masih dapat membaca apa pun dari layar (teks biner acak flooding dapat dengan mudah mengacaukan set karakter Anda).
Seperti yang diingat oleh Gilles jika Anda meminimalkan jendela, mungkin sistem akan lebih cepat membaca permintaan interupsi daripada mematikan prosesnya. Jadi menangguhkan / mematahkan, memperkecil, menunggu sebentar, memaksimalkan lagi, bisa menjadi solusi juga.
Tentu saja melalui koneksi ssh, saya berharap Anda perlu menunggu beberapa saat.
Di terminal / sesi lain Anda dapat bertanya
pgrep cat
(apakah cat adalah perintah yang dipanggil) dan mengidentifikasi proses cat menggunakan lebih banyak cpu Anda. Anda dapat mengidentifikasinya dengan lebih presisi denganpstree
:pgrep cat | awk '{print "pstree -sp" $ 1}' | sh | grep sshd
jawab dengan output seperti
init (1) ───sshd (1062) ───sshd (22884) ───sshd (22951) ───bash (22957) ───cat (23131)
Dalam hal ini, setelah Anda hanya perlu membunuh PID kucing: bunuh 23131
catatan:
less
lebih aman.sumber
Saya memiliki masalah yang sama dan tidak puas dengan jawaban di sini jadi saya menggali lebih dalam. Orang lain telah menyebutkan bahwa perintah Anda adalah mengeluarkan data lebih cepat dari yang dapat diambil ssh, sehingga buffer data, dan buffer tidak dapat dihentikan.
Untuk memperbaiki ini, hindari buffering dengan membatasi output perintah Anda ke tingkat maksimum yang bisa diambil oleh sesi ssh Anda, perintah sudah ada untuk melakukan ini.
Pengaturan, pertama cari tahu tingkat maksimum sesi Anda:
Akhirnya, tetapkan sesuai perintah Anda yang sebenarnya.
Contoh:
Anda mungkin ingin mengurangi RATE sedikit jika kecepatan koneksi Anda sedikit menurun dari waktu ke waktu. Jika menurun, perilaku akan kembali ke masalah, ctrl-c yang tidak responsif.
Alias kucing tercekik opsional:
Sekarang ctrl-c berfungsi seperti yang diharapkan, segera mematikan output karena sangat sedikit jika ada buffer.
sumber
cat
output jarang menjadi masalah, tidak seperti perangkat lunak lain. Penulis hanya menggunakannya sebagai contoh. Masalahnya biasanya karena perangkat lunak lain yang mungkin tidak jelas jika bersedia menghasilkan banyak output. Menggunakan segala macam perintah awalan atau postfix bukanlah solusi, karena butuh waktu untuk mengetiknya. Tidak akan ada keuntungan apa pun dalam hasil.Ada perangkat lunak di Linux yang memecahkan masalah ini (beberapa hal lainnya juga). Anda juga dapat memintanya dari terminal emulator di Windows (Anda tampaknya menggunakan Windows?).
Coba mosh , pengganti biner SSH. Ia bekerja persis seperti SSH (Anda dapat melakukan
mosh user@hostname
alih - alihssh user@hostname
dan itu akan bekerja persis seperti yang Anda harapkan, bahkan akan melakukan otentikasi kunci pribadi dll.Ini pada dasarnya menjalankan proses terpisah pada server yang mendukung paket. Jadi ketika Anda menekan Ctrl + C pada mosh, itu akan menyampaikan ini ke server jauh, yang kemudian akan berhenti mengirim informasi tambahan. Selain itu, itu juga akan memprediksi hasil penekanan tombol, menghemat beberapa milidetik setiap kali Anda menekan tombol.
Kelemahan: Saat ini tidak mungkin untuk menggulir ke atas dalam riwayat saat menggunakan mosh.
sumber