Apa yang harus dilakukan ketika Ctrl + C tidak dapat mematikan proses?

171

Ctrl+ Ctidak selalu berfungsi untuk mematikan proses saat ini (misalnya, jika proses itu sibuk dalam operasi jaringan tertentu). Dalam hal ini, Anda hanya melihat "^ C" dengan kursor Anda dan tidak bisa melakukan banyak hal lain.

Apa cara termudah untuk memaksa proses mati sekarang tanpa kehilangan terminal saya?

Ringkasan jawaban: Biasanya, Anda dapat Ctrl+ Zuntuk meletakkan proses ke sleep, dan kemudian lakukan kill -9 _process-pid_, di mana Anda menemukan pid proses dengan ps dan alat lainnya. Di Bash (dan mungkin shell lain), Anda dapat melakukan kill -9 %1(atau '% N' secara umum) yang lebih mudah. Jika Ctrl+ Ztidak berfungsi, Anda harus membuka terminal lain dan mematikannya dari sana.

Dustin Boswell
sumber
screenakan menjadi solusi yang memungkinkan, Memungkinkan Anda untuk membuat jendela baru dan killproses dari sana.
Bobby
2
dengan asumsi Anda sudah berada di layar :)
Dustin Boswell

Jawaban:

119

Untuk memahami masalah mengapa Ctrl+ Ctidak berhasil, sangat membantu untuk memahami apa yang terjadi ketika Anda menekannya:

Kebanyakan shell mengikat Ctrl+ Cuntuk "mengirim sinyal SIGINT ke program yang saat ini berjalan di latar depan". Anda dapat membaca tentang berbagai sinyal melalui sinyal manusia :

 SIGINT        2       Term    Interrupt from keyboard

Program dapat mengabaikan sinyal itu, karena mereka dapat mengabaikan SIGTSTP juga:

 SIGTSTP   18,20,24    Stop    Stop typed at tty

(Itulah yang dilakukan sebagian besar shell ketika Anda menekan Ctrl+ Z, itulah sebabnya tidak dijamin berfungsi.)

Ada beberapa sinyal yang tidak dapat diabaikan oleh proses: SIGKILL , SIGSTOP dan beberapa lainnya. Anda dapat mengirim sinyal ini melalui perintah kill . Jadi, untuk membunuh proses hang / zombieying Anda, cari saja ID proses (PID). Misalnya, gunakan pgrepatau pslalu kill:

 % kill -9 PID
akira
sumber
13
Sebuah komentar belaka. Waspadalah bahwa "zombie" secara teknis adalah keadaan proses, dan itu tidak sama dengan apa yang Anda maksudkan di sini dengan "zombieying". (Proses penghentian yang belum ditunggu () - ed oleh induknya dalam Zkeadaan zombie ( ). Dalam hal ini, ia tidak dapat menangani sinyal lagi.)
Stéphane Gimenez
sayangnya, kadang-kadang ctrl + c, ctrl + z, dan ctrl + \ semua tidak melakukan apa-apa, dan prosesnya berjalan dibatalkan sudo (diizinkan tanpa kata sandi) sehingga Anda tidak bisa hanya mengirim sinyal ke proses.
Michael
112

Jika Ctrl+ C(SIGINT) tidak berfungsi, coba Ctrl+ \(SIGQUIT). Kemudian coba Ctrl+ Z(SIGTSTP). Jika itu mengembalikan Anda ke prompt shell, lakukan killpada ID proses. (Ini default untuk sinyal SIGTERM, yang dapat Anda tentukan dengan kill -TERM. Dalam beberapa shell, Anda mungkin dapat menggunakan %1untuk merujuk ke PID.) Jika itu tidak berhasil, pergi ke terminal lain atau sesi SSH dan lakukan killatau kill -TERMpada ID proses. Hanya sebagai upaya terakhir yang harus Anda lakukan kill -KILL, alias kill -9, karena tidak memberikan proses peluang untuk membatalkan dengan baik, menyinkronkan file yang terbuka, menghapus file sementara, menutup koneksi jaringan, dll.

Teddy
sumber
32

Tekan Ctrl-Z untuk menunda program dan meletakkannya di latar belakang :

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(Kembalikan ke latar depan menggunakan lagi fg)

Kemudian, Anda bisa killatau kill -9itu, diberi ID prosesnya (Anda mendapatkannya dari ps a).

Daniel Beck
sumber
13
Dengan bash Anda bisa kill $!, seperti $!variabel khusus yang berisi pid dari program berlatar belakang terakhir.
Lloeki
@Lloeki Tidak bekerja untuk saya (setidaknya tidak dapat diandalkan). Saya harus bgsekali sebelum variabel mendapatkan nilai yang diberikan.
Daniel Beck
2
@Aniel, benar. Seperti yang saya katakan proses latar belakang terakhir , sehingga perlu bgtepat setelah Ctrl + Z itu hanya ditangguhkan.
Lloeki
2
Catatan: ini bukan hanya tipuan, menggunakan psoutput (atau killall) cukup berisiko jika Anda memiliki banyak proses dengan nama yang sama berjalan. ps -e -o pid,commandakan memberikan pid + argumen penuh, bukan hanya nama program, tetapi sekali lagi mungkin tidak cukup untuk melakukan diskriminasi. Sebaliknya $!adalah hit yang pasti.
Lloeki
1
@Lloeki saya tidak setuju. Contoh jalur keluaran dari ps apada sistem saya: 27721 s000 T 0:00.09 topBerapa banyak Tcontoh yang ditangguhkan ( , saya pikir) dari perintah yang sama ( top) yang Anda jalankan di tty yang sama ( s000)?
Daniel Beck
30

Lihat tautan ini juga.

Ctrl+ Z: menghentikan sementara suatu proses.

Ctrl+ C: dengan sopan minta proses untuk mematikan sekarang.

Ctrl+ \: tanpa ampun membunuh proses yang saat ini ada di latar depan

RoboAlex
sumber
"ctrl"+ "\"tidak bekerja untuk saya
Benyamin Jafari
13

Biasanya, Anda masih bisa menghentikan proses ( Ctrl+ Z) dan kemudian menggunakannya kill -9. Sebab kill -9, Anda perlu proses PID terlebih dahulu. Untuk pekerjaan latar belakang, kill -9 %1cara termudah untuk melakukannya - jika Anda tidak yakin berapa jumlah pekerjaan latar yang ingin Anda bunuh, jalankan jobs.

Atau, Anda dapat menemukan ID proses dengan

ps

Maka Anda bisa lari

kill -9 <Appropriate PID from ps output>
Olli
sumber
5

Solusi yang lebih sederhana untuk Bash (dan cangkang lainnya?) Adalah dengan melakukan:

Ctrl-z      followed by     kill -9 %1

di mana '% 1' mengacu pada nomor pekerjaan yang terbunuh. Mungkin '% 2' (atau yang lain) jika Anda sudah memiliki pekerjaan lain. Anda dapat melihat nomor pekerjaan itu saat Anda menekan Ctrl-z:

[1]+  Stopped                 <process name>

Perhatikan bahwa 'kill' adalah versi shell dari kill, bukan / bin / kill.

Dustin Boswell
sumber
4

1) Jika Anda berada di konsol dan dalam mode multi-pengguna, Anda dapat menekan CTRL-ALT-Fn dan masuk di layar lain, gunakan ps -ef | grep <myprocessname>atau pidof <myprocessname>kemudian bunuh -9 proses dengan nomor ID.

2) Jika Anda terhubung dari jarak jauh, lakukan hal yang sama melalui sesi terminal lain.

Anda juga bisa membuat hidup sedikit lebih mudah dengan menginstal htop , yang merupakan versi top yang lebih fleksibel yang memungkinkan Anda untuk secara selektif mematikan proses yang sedang berjalan. Sebagian besar distro memiliki repo.

3) jika Anda hanya terjebak dalam sesi ssh hung (ke sistem lain, misalnya), coba tekan tilde (~), yang merupakan tombol pelarian, dan kemudian tekan CTRL-Z untuk kembali ke sesi host, maka Anda dapat membunuh proses ssh yang macet atau menunggu sampai batas waktu habis, yang sebagian besar masih dilakukan setelah periode tidak aktif.

Linker3000
sumber
0

Jika Anda menggunakan tmux atau layar, dan tidak satu pun di atas berfungsi, Anda masih bisa mematikan panel <prefix> x, maka prosesnya juga mati.

ospider
sumber
0

Mungkin ada jebakan yang diatur dengan SIGINT (2) di / etc / profile Anda. Jika demikian, hapus. Logout dan masuk kembali dan Anda harus baik.

TechNo_phile
sumber