Ctrl + c tidak akan mematikan proses

8

Saya telah mencari jawaban dan sejauh ini tidak menemukan apa pun untuk menjawab pertanyaan saya. Saat ini saya masuk ke server Ubuntu saya dan setelah menjalankan proses saya tidak dapat menjalankan interupsi di atasnya. Ini stty-a saya:

user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;

Saya tidak punya apa-apa di .bashrc saya yang mengubah interupsi.

Ini sama untuk semua pengguna termasuk root. Saya juga telah mencoba masuk dari lokasi yang berbeda menggunakan terminal yang berbeda dan setiap kali hasil yang sama ini muncul. Saya telah menggunakan ssh dan ssh -X untuk login.

Sunting: Secara lokal semua interupsi saya berfungsi dengan baik.

Pembaruan: Saya masih mencari jawaban. Teman saya memiliki masalah yang persis sama. Masalahnya tampaknya sangat ketika ketika masuk (dari PC, Mac, Linux) keyboard tidak mengambil kunci ini (meskipun dipetakan dengan benar).

user700786
sumber
Apa hasil dari Ctrl+Vdan memukul Ctrl+C? Sudahkah Anda mencoba membunuh prosesnya kill -s 2 <pid_of_process>? Ini harus sama dengan mengirim sinyal SIGINT ke proses. Periksa pengaturan kunci emulator terminal Anda.
Outputnya benar. Jika saya melakukan Ctrl + V berikut dan kemudian Ctrl + CI dapatkan ^ C. Saya mendapatkan hal yang sama jika saya melakukan Ctrl + V dan kemudian Ctrl + ZI mendapatkan ^ Z. Saya dapat mematikan proses dengan kill jika saya melakukan ini dari terminal lain. Juga perhatikan secara lokal dan di terminal lain perintah ini berfungsi dengan baik
user700786
3
Sudahkah Anda mencoba memukul Ctrl+Csaat menjalankan proses lain (misalnya cat)? Mungkin itu proses yang mengabaikan Ctrl+C. Atau maksud Anda secara lokal di server Ubuntu, proses tertentu merespons Ctrl+C, dalam hal apa, di terminal apa Anda mencoba? Bagaimana dengan screensesi?
Gilles 'SO- stop being evil'
Jika saya menjalankan apa pun di terminal pada mesin saya maka itu akan mengambil interupsi tidak ada masalah. Segera setelah saya ssh ke server saya bahwa itu tidak akan mengambil interupsi. Tak satu pun dari proses yang saya coba ambil setiap interupsi
user700786
Jika perintah terbunuh dengan kill -s 2(perhatikan -s 2, itu SIGINT(sinyal yang biasanya dikirim ketika Anda menekan Ctrl + C, default untuk killadalah SIGTERM)), maka perintah tersebut tidak mengabaikan interupsi. Sesuatu yang lain mengambilnya. Ketika Anda menjalankan ini secara lokal dan berfungsi, apakah Anda mengatakan itu bekerja menggunakan terminal yang sama di mesin klien untuk menjalankan sesuatu secara lokal, atau menjalankan emulator terminal secara lokal di mesin server? Saya ingin tahu apakah Anda menggunakan beberapa emulator yang mencoba meniru Ctrl + C dari dunia Windows ...
njsg

Jawaban:

5

ctrl+ ctidak pernah mematikan program,

Bukan hanya itu yang dilakukannya.

Ada serangkaian sinyal yang ditentukan oleh standar POSIX, ini digunakan untuk mengontrol program yang sedang berjalan.

  First the signals described in the original POSIX.1-1990 standard.
  Signal     Value     Action   Comment
  ──────────────────────────────────────────────────────────────────────
  SIGHUP        1       Term    Hangup detected on controlling terminal
                                or death of controlling process
  SIGINT        2       Term    Interrupt from keyboard
  SIGQUIT       3       Core    Quit from keyboard
  SIGILL        4       Core    Illegal Instruction
  SIGABRT       6       Core    Abort signal from abort(3)
  SIGFPE        8       Core    Floating point exception
  SIGKILL       9       Term    Kill signal
  SIGSEGV      11       Core    Invalid memory reference
  SIGPIPE      13       Term    Broken pipe: write to pipe with no
  SIGTERM      15       Term    Termination signal

- http://man7.org/linux/man-pages/man7/signal.7.html

ctrl+ cmengirimkan sinyal 2, "Interrupt from keyboard" ke program yang telah Anda jalankan dari terminal.

Sepenuhnya tergantung pada program untuk menangani sinyal itu, ia dapat melakukan apa pun yang diinginkannya. Banyak penerjemah bahasa scripting yang dapat menangani hal ini secara default dengan mematikan skrip yang dipanggil dan keluar dengan anggun.

Jika Anda ingin sebuah program keluar, khususnya dari konteks otomatis, singal 15 direkomendasikan, killprogram tersebut dapat digunakan untuk mengirim sinyal ke suatu proses oleh id (pid).

kill -15 <pid>

Sejauh yang saya ketahui, program masih menerima sinyal ini sendiri, dan harus mengakhiri ASAP sebersih mungkin.

Jika program mengabaikan sinyal 15, Dan program tetap hidup (dan Anda tidak gagal mengirim sinyal karena kesalahan izin)

kill -9 <pid>

Sinyal 9, sejauh yang saya ketahui, ditafsirkan oleh kernel (task manager, dan antarmuka perangkat keras), Kernel tiba-tiba berhenti memproses program, dan tidak mengalokasikan / membebaskan semua sumber dayanya.

ThorSummoner
sumber
3

Inilah beberapa trik hardcore:

Control-Z

itu akan menangguhkan proses Anda dan itu akan mengembalikan Anda ID pekerjaan dari proses itu

Kemudian:

kill -9 %1

(ganti 1 dengan ID pekerjaan Anda).

Catatan: Persentase wajib !, jika tidak, Anda akan mematikan proses init Anda yang berarti Anda akan membunuh kernel dan seluruh sistem akan macet (jadi jangan beri ruang di antaranya :)

kenorb
sumber
0

Ctrl + c tidak akan mematikan proses. itu hanya akan menghentikan proses berjalan saat ini di tengah. Untuk mematikan prosesnya, kita perlu menggunakan perintah "KILL"

Rajeev Tarun Mavuri
sumber
7
Bahkan killmengirim sinyal ke suatu proses. Tidak membunuhnya. Sinyal default yang dikirim bersama killadalah TERM, sinyal yang dikirim bersama ctrl+cadalah SIGINT.
fmanco
0

Saya berlari ke posting forum lama ini tentang masalah khusus ini. Tampaknya urutan interupsi default dapat ditimpa dalam file konfigurasi terpisah di suatu tempat.

Jika Anda hanya ingin membunuh proses ini secara eksternal, Anda dapat menggunakan kill hanya berhati-hatilah bahwa Anda harus meningkatkan pembunuhan seperti yang dijelaskan dalam artikel ini tentang proses pembunuhan , daripada hanya melompat ke kill -9 yang paling ekstrem.

Wikipedia adalah sumber yang bagus untuk program kill . Juga di sini adalah daftar sinyal Unix dan apa yang mereka lakukan.

jjclarkson
sumber