Apa yang harus dilakukan ketika Ctrl-C tidak akan mematikan pekerjaan yang sedang berjalan?

98

Terkadang, proses mengabaikan sinyal SIGINT yang dikirim oleh Ctrl- Cdi Bash. Misalnya, mandan vi. Dengan asumsi Anda tidak ingin google atau membaca manual tentang cara keluar dari proses yang sedang berjalan, apakah ada urutan kunci yang akan selalu berfungsi (tanpa meninggalkan terminal)?

Olivier Lalonde
sumber

Jawaban:

141

Kirim sinyal SIGQUIT dengan Ctrl+ \.

.. $ sleep 10
^\Quit

→ Ini sama dengan kill -3 pid. Program yang dijalankan di ruang pengguna tidak mengabaikan sigquit.

Ada juga satu set pintasan keyboard Magic SysRq . Salah satu yang lebih menarik adalah ini: Alt+ SysRq+ k. Ini membunuh setiap proses pada konsol virtual saat ini. Jika salah satu dari Anda benar-benar dan benar-benar rusak, ini dapat digunakan untuk kembali . Pada tty menjalankan X.org, ini dapat digunakan untuk membunuh X tanpa ampun.

Tombol SysRq, pada kebanyakan keyboard, sama dengan Print Key. Di buku catatan saya, ini dapat dipanggil menggunakan tombol Fn; Yaitu Alt → Fn → Cetak → k dalam urutan itu.

Berikut adalah beberapa cara pintas manajemen proses dasar:

  • Ctrl+ Z: menjeda proses (plus bguntuk melanjutkan di latar belakang, fguntuk menaikkan ke latar depan)
  • Ctrl+ C: dengan sopan minta proses untuk mematikan sekarang
  • Ctrl+ \: tanpa ampun membunuh proses yang saat ini ada di latar depan
  • Alt+ SysRq+ s: Tulis data ke disk (selalu lakukan ini sebelum membunuh sesuatu yang penting)
  • Alt+ SysRq+ s, k: Tanpa ampun membunuh semua proses saat ini pada konsol virtual yang diberikan
  • Alt+ SysRq+ s, b: Tanpa ampun me-reboot tanpa unmounting,
  • Alt+ SysRq+ r, e, i, s, u, b: Aman r eboot e ven i f s ystem adalah u tterly b roken,

Catatan: Ctrl+ Z, berbeda dengan Ctrl+ Cdan Ctrl+ \, juga bekerja untuk man, vi, less, dan sejenisnya.

Jika ragu, prosedur mengikuti hampir selalu berhasil:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ Z tentu saja menunjukkan bahwa Ctrl+ Ztelah ditekan.


Untuk melihat lebih dalam di Shells and Terminal, lihat juga jawaban saya di:

Stefano Palazzo
sumber
3
Bekerja untuk "sleep 10" tetapi masih tidak bekerja untuk "man" atau "vi". Jelas "kill -9 pid" memang berhasil membunuh kedua proses. Apakah saya melewatkan sesuatu?
Olivier Lalonde
3
Ctrl + Z bekerja dengan hal-hal seperti less, man, vi, dan sebagainya. Anda kemudian dapat membunuh mereka dengan melakukan a psuntuk melihat id proses mereka dan membunuh mereka menggunakan kill pidatau, jika Anda tidak peduli dengan contoh lain dari program killall vi,. Bagaimanapun, Ctrl-Z sepertinya selalu berfungsi.
Stefano Palazzo
5
Anda juga dapat melakukannya kill %%untuk mematikan pekerjaan terakhir dan di kill %5mana 5 adalah nomor pekerjaan yang ditunjukkan jobs.
Olivier Lalonde
2
Ctrl- \ mengirim SIGQUIT , bukan SIGKILL. Ada beberapa perbedaan penting antara SIGQUIT dan SIGKILL. en.wikipedia.org/wiki/SIGQUIT
Juliano
4
Bagaimana cara saya menekan Ctrl+ \ ketika tidak ada \ tombol di tata letak keyboard saya?
Forivin
14

Anda dapat mencoba Ctrl+\

Benjamin
sumber
1
Tidak bekerja dengan salah satu manatau vi.
Hippo
1
bekerja ubuntu 16.04
kRazzy R
8

Terkadang CTRL+Cdikirim ke program atau saluran input yang salah. Ini sangat umum dengan editor seperti vi, dengan perintah dengan output pip, perintah bash kompleks yang melibatkan loop, dll.

Solusi sederhana dan cepat adalah menangguhkan pekerjaan CTRL+Zdan kemudian membunuhnya dengan nomor pekerjaan: kill %1atau kill -9 %1, dll.

tylerl
sumber
6
  • Coba salah satu dari ini:

    Ctrl+4

    Ctrl+\


  • Atau:

    Ctrl+ Zlalu jalankan:

    kill %1

Di mana %1jumlah pekerjaan yang dikembalikan saat Anda menekan Control- Z. Tambahkan -9untuk memaksa pembunuhan.


Ketika Anda berada di konsol teks, Anda juga dapat mencoba: Ctrl- SysRq. Kernel harus mematikan proses.

Atau SysRq- k, bunuh semua proses pada konsol virtual saat ini (dapat membunuh program X dan svgalib juga).

Catatan: Ketika tombol SysRq ajaib digunakan untuk mematikan program grafis yang dibekukan, program tidak memiliki kesempatan untuk mengembalikan mode teks. Ini dapat membuat semuanya tidak dapat dibaca.

Lihat: Kunci SysRq Ajaib dan kombinasi perintahnya.

kenorb
sumber
3

Untuk berhenti dari pria , gunakan q Untuk meninggalkan vi gunakan:q

antivirtel
sumber
0

Mungkin saja Anda mengubah pintasan salinan dari:

CTRL+ SHIFT+C

Untuk

CTRL+C

Dengan begitu, ketika Anda mencoba untuk mematikan suatu proses, tanda CTRL+ Ctidak berfungsi.

Coba ganti pintasan salin ke CTRL+ SHIFT+ C.

Minter
sumber
1
Mengubah pintasan salin tidak relevan untuk memaksa proses dihentikan!
SuB
Bisakah Anda sedikit memperluas jawaban Anda? Langkah demi langkah akan ideal, terutama agar OP dapat mengikuti saran Anda. :)
ThatGuy
Ini sebenarnya membantu saya. Saya sudah terbiasa dengan CTRL + C di MacOS, dan tidak menyadari bahwa perintah Ubuntu adalah CTRL + SHIFT + C
ratskin
-1

Coba Ctrl+ Alt+Backspace

Jika Anda menggunakan ubuntu 10.04 Anda ingin mengaktifkan kunci ini untuk bekerja.

Untuk mengaktifkan Control- Alt-Backspace

Sistem Goto -> Preferensi -> Keyboard

Pilih tab Layouts dan klik pada Layout Options .

Pilih Urutan kunci untuk membunuh server X dan mengaktifkan Control+ Alt+Backspace .

catatan:

Menekan Ctrl- Alt- Backspaceakan memulai ulang server X Anda.

karthick87
sumber
Mengedit pertanyaan untuk memperjelas bahwa saya ingin mematikan proses dari dalam terminal.
Olivier Lalonde