Bagaimana cara membunuh kucing pelarian?

128

Sering kali saya tidak sengaja menjalankan catperintah pada file yang memiliki konten hingga beberapa ribu baris.

Saya mencoba untuk membunuh catperintah dengan Ctrl+ Catau Ctrl+ Z, tetapi keduanya hanya berlaku setelah total output catditampilkan di terminal, jadi saya harus menunggu sampai catsepenuhnya dieksekusi.

Apakah ada solusi yang lebih baik yang menghindari menunggu? Karena kadang-kadang file hingga ukuran 100MB, dan itu menjengkelkan untuk menunggu.

Saya menggunakan tcsh.

JigarGandhi
sumber
14
Menggunakan perintah seperti lebih banyak, lebih sedikit, ekor, kepala mungkin merupakan alternatif yang menarik untuk kucing. (tentu saja ini bukan jawaban ...)
tonioc
25
Itu adalah judul pertanyaan terbesar yang pernah saya baca. Sampai saya melihat bahwa tautan pertanyaannya adalah untuk UL, saya pikir Anda perlu bantuan membunuh kucing melarikan diri.
Lenz
5
Lakukan double-take di sidebar question dari situs SE lain. Sangat lega melihat logo "UL" di sebelah pertanyaan . Lupakan, lanjutkan. (biasanya, Arquade-lah yang memiliki judul pertanyaan yang terlihat sangat keliru di luar konteks)
LindaJeanne
12
Saya akan mencoba curiosityperintah ...
Sekhemty
4
alias curiosity='sudo killall cat'
Kasus

Jawaban:

76

Jika file yang dimaksud benar-benar berisi banyak data yang mengirim sinyal, sebenarnya bisa sampai catsebelum selesai. Apa yang benar-benar Anda amati adalah kecepatan terminal Anda yang terbatas - catmengirimkan data ke terminal dan butuh beberapa waktu bagi terminal untuk menampilkan semua itu.

Ingat, biasanya ia harus menggambar ulang seluruh jendela output untuk setiap baris output (yaitu memindahkan isi jendela satu baris ke atas dan mencetak baris berikutnya di bagian bawah). Meskipun ada teknik dan algoritma untuk membuat ini lebih cepat daripada jika dilakukan dengan cara yang mudah, masih membutuhkan waktu.

Jadi, jika Anda ingin menyingkirkan output secepat mungkin, sembunyikan jendela terminal , karena biasanya tidak ada redrawing yang sebenarnya terjadi. Dalam lingkungan grafis ini dapat berarti meminimalkan jendela atau beralih ke desktop virtual yang berbeda, pada konsol virtual Linux cukup beralih ke yang lain (( Ctrl+) Alt+ ).Fx

Juga perhatikan bahwa jika Anda menjalankan ini melalui tautan jaringan lambat (SSH melalui koneksi GSM misalnya), Anda pasti akan melihat lebih sedikit keluaran sebelum catterbunuh oleh sinyal, karena kecepatan terminal tidak akan menjadi hambatan lagi .

peterph
sumber
6
Jika Anda menunggu data turun pipa SSH lambat, Anda dapat menggunakan urutan melarikan diri OpenSSH untuk menutup koneksi. Pada baris baru, ketik ~?untuk melihat opsi yang tersedia ( ~.ditutup).
RJHunter
11
Anda juga mencoba menghentikan output dengan Ctrl + S yang mengirim tty-stop-output. Anda kemudian dapat mengirim Ctrl + C. Untuk melanjutkan output, tekan Ctrl + Q ...
Martin Tournoij
1
@Carpetsmoker Menguji itu, tidak menghentikan aliran teks untuk saya di Ubuntu 14.04 + terminator + zsh.
muru
@muru, terima kasih. Saya mencoba mengujinya, tetapi tidak dapat mereproduksi masalah (sistem saya terlalu cepat, sepertinya, atau mungkin saya tidak berusaha cukup keras).
Martin Tournoij
4
@Carpetsmoker Saya takut kontrol aliran perangkat lunak (yang merupakan Ctrl + S) tidak akan banyak membantu dalam kasus ini (dari tautan terminal cepat) - data sudah ada di buffer terminal dan menunggu terminal memprosesnya. Oleh karena itu Ctrl + S akan memberi tahu aplikasi untuk berhenti mengirim lebih banyak data, tetapi apa yang sudah dikirim masih harus ditampilkan.
peterph
4

Pengaturan Terminal

Saya rasa ini lebih berkaitan dengan cara terminal diatur, daripada dengan masalah buffering. Periksa output dari stty -a | grep intr, Anda harus memiliki intr = ^C;pada baris output jika Ctrl- Cdiaktifkan di tty/ pty. Jika tidak, Anda dapat menggunakannya stty intr ^Cuntuk mengaktifkannya. Tambahkan baris ke Anda .tcshrcatau .loginuntuk membuatnya permanen (atau hapus baris yang mengubahnya di tempat pertama!).

Gagal Ctrl- C, Anda juga dapat mencoba mengirim SIGQUITdengan Ctrl- \. Jika ini tidak berhasil, periksa lagi stty -a | grep quituntuk melihat apakah sudah diatur dengan benar.

Pengaturan Terminal Emulator

Juga periksa pengaturan untuk emulator terminal Anda (jika Anda menggunakannya), mungkin ada pintasan yang diatur pada tingkat ini (mungkin untuk menyalin atau sesuatu) dan Ctrl- Ctidak mencapai ptytingkat. Pintasan juga dapat diatur di tempat lain di lingkungan desktop atau sistem Window Anda.

Tes yang bagus di Linux jika Anda menggunakan emulator terminal adalah beralih ke konsol Linux ( Ctrl- Alt- F1), masuk di sana dan lihat apakah perilaku yang sama terjadi. Jika tidak maka ini menunjukkan masalahnya terletak pada sistem Window atau emulator terminal Anda.

Ini bisa menjadi masalah dengan keterlambatan antara data yang sedang dibaca dari ptyperangkat seperti yang disarankan oleh peterph . Tetapi jika hal ini terjadi dan Anda benar-benar harus menunggu menit untuk data yang akan ditampilkan, maka pasti emulator terminal buffering cara terlalu banyak data (atau PC Anda sangat lambat). Jawabannya adalah menemukan cara untuk mengurangi ukuran buffer itu di pengaturan emulator terminal Anda atau menggunakan yang lain.

Tip ekstra

Sesuatu yang lain perlu ditambahkan; Saya biasanya berakhir dalam catsituasi pelarian ketika jika saya tidak sengaja catfile biner. Efek lain dari hal ini adalah mengacaukan pengaturan terminal Anda (jika data biner cocok dengan berbagai kode pelarian terminal yang sering dilakukannya). Jika tputdiinstal (biasanya secara default), Anda dapat menghindari keharusan me-restart dengan perintah berikut:

tput reset
Graeme
sumber
3

Inilah tmuxopsi c0-change-intervaldan c0-change-triggerdirancang untuk apa. Anda harus menggunakan manajer layar untuk sesi yang dapat dilanjutkan.

J-16 SDiZ
sumber
1

The Ctrl- OPilihan telah di Unix sejak 110 hari baud. Perintah runaway cat selalu menjadi masalah ketika file ASCII panjang dibuang di perangkat output lambat dan seluruh file ditempatkan di buffer output driver perangkat. Ctrl- Oakan memulai flush buffer dan tindak lanjut Ctrl- Oakan mematikan flush sehingga kucing dapat dibaca dengan kecepatan normal. Ctrl- Odimasukkan dan seluruh file akan memerah dan dengan cepat mengembalikan command prompt.

Apakah atau tidak coders driver perangkat Linux merasa perlu untuk terus menambahkan fitur ini tidak diketahui. Fitur ini ditambahkan pada level driver perangkat di mana Ctrl- Sdan Ctrl- Qhanya dapat diimplementasikan. Saya menggunakan ini untuk membuang proses debugging besar dengan banyak cetak cek dan kemudian gulir ke bawah ke tempat yang perlu saya lihat.

pengguna62612
sumber
Ctrl-O tampaknya tidak diterapkan di Linux modern, setidaknya tidak server RHEL atau Ubuntu.
dotancohen
-1

Saat menggunakan bash, Anda dapat menangguhkan pekerjaan menggunakan Ctrl+ Zlalu membunuhnya, baik menggunakan PID atau dengan mengikuti jawaban dari https://stackoverflow.com/questions/1624691/linux-kill-background-task (mis. Kill -9 %%)

Jannis
sumber
3
tapi saya menggunakan tcshdan Ctrl + Z tidak berfungsi ... sudah menyatakan itu dalam pertanyaan.
JigarGandhi
ya, maaf, tidak membaca di posting Anda bahwa Anda mencoba Ctrl + Z dan saya salah berasumsi bahwa Ctrl + Z ditangani oleh shell berbeda dengan Ctrl + C yang ditangani oleh aplikasi. Itu sebabnya saya pikir Ctrl + Z bekerja secara instan sedangkan Ctrl + C tidak.
Jannis
-1

buka konsol baru, misalnya dengan mengklik ikon konsol atau dengan menekan Ctrl+ Alt+ F2. Di sana, masuk

killall -9 cat

dan kucing akan dibunuh kecuali jika Anda memiliki kunci NFS yang basi atau situasi "tidur yang tidak terputus" (baca di sektor yang buruk tanpa batas waktu yang ditetapkan).

Thorsten Staerk
sumber
10
Masalahnya bukan dengan cat, ini tentang apa yang cattelah ditulis ke terminal sebelum sekarat dan belum dibaca apalagi diproses atau ditampilkan oleh terminal emulator (dan sedang duduk di buffer (sekitar 64kiB besar di Linux) di dalam driver pty) .
Stéphane Chazelas
Kemudian silakan coba echo 3> / proc / sys / vm / drop_caches yang akan menjatuhkan banyak buffer juga.
Thorsten Staerk
7
Tidak, itu hanya akan menjatuhkan data yang di-cache tidak pernah hal-hal seperti itu karena itu akan mempengaruhi fungsi!
Stéphane Chazelas
4
@ThorstenStaerk drop_cachesmengontrol halaman yang digunakan sebagai cache oleh kernel (biasanya untuk sistem file), bukan buffer internal terminal, driver jaringan dan semacamnya - jika itu terjadi, itu akan memiliki konsekuensi yang cukup buruk seperti yang ditunjukkan Stéphane (pada dasarnya Anda akan kehilangan data) .
peterph
1
Tidakkah hal itu killall -9 catjuga akan membunuh contoh kucing lain yang mungkin masih melakukan hal-hal baik di utas proses lainnya?
Joe
-7

Anda dapat mencoba ini

Setel ulang penggunaan layar -ctrlj

Jika kucing masih berjalan maka buka terminal baru dan jalankan ini pkill -9 -f cat"Ini akan membunuh semua proses kucing."

vembutech
sumber
Ctrl + J tidak berfungsi
JigarGandhi
26
pkill dengan '-f cat' cukup berbahaya, karena -f akan mencari pola 'cat' di seluruh baris perintah, yang kemungkinan akan terjadi, dan menyebabkan hasil yang tidak diinginkan ...
tonioc
2
Sebagai contoh, pkill -f catpada desktop saya akan membunuh area system tray dari taskbar Xfce4.
Markus