Saya hanya menekan Ctrlcdua kali pada shell saya dalam upaya untuk menghentikan proses yang membutuhkan waktu lama untuk menyelesaikannya.
^C
digemakan dua kali, tetapi prosesnya terus berjalan.
Mengapa tidak Ctrlcberhenti dari proses seperti biasanya?
kill -9 %
membunuhnya. Sinyal 9 tidak dapat diabaikan, juga tidak dapat menangguhkan sinyal. Urutan keyboard CTRL + Z dapat diabaikan dalam teori - tetapi tidak dalam praktiknya.perl -E '$SIG{TSTP} = sub { say "ha ha" }; sleep 1 while 1'
. Anda mungkin berpikir tentang SIGSTOP, yang merupakan sinyal berbeda.Jawaban:
Proses dapat memilih untuk:
trap '' INT
di shell) atau memiliki handler sendiri untuk itu yang memutuskan untuk tidak mengakhiri (atau gagal untuk mengakhiri tepat waktu).stty int '^K'
di shell)stty -isig
dalam shell).Atau, mereka bisa tidak terputus, seperti ketika di tengah panggilan sistem yang tidak dapat diganggu.
Di Linux (dengan kernel yang relatif baru), Anda dapat mengetahui apakah suatu proses mengabaikan dan / atau menangani SIGINT dengan melihat output dari
SIGINT adalah 2. Bit kedua SigIgn di atas adalah 1, yang berarti SIGINT diabaikan.
Anda dapat mengotomatiskannya dengan:
Untuk memeriksa apa
intr
karakter saat ini atau jikaisig
diaktifkan untuk terminal yang diberikan:(di atas
intr
karakter adalah^C
(karakter yang biasanya dikirim oleh terminal Anda (emulator) ketika menekan CTRL-Cdan sinyal input tidak dinonaktifkan.(
intr
karakter adalah^K
danisig
dinonaktifkan untuk/dev/pts/1
).Untuk kelengkapan, ada dua cara lain proses dapat melakukan sesuatu untuk berhenti menerima SIGINT meskipun itu bukan sesuatu yang biasanya Anda lihat.
Setelah itu Ctrl+C, sinyal SIGINT dikirim ke semua proses dalam kelompok proses latar depan terminal . Biasanya shell yang menempatkan proses dalam kelompok proses (dipetakan ke pekerjaan shell ) dan memberi tahu perangkat terminal yang merupakan yang paling depan .
Sekarang sebuah proses bisa:
Tinggalkan grup prosesnya. Jika pindah ke grup proses lain (grup proses mana pun kecuali yang merupakan latar depan ), maka ia tidak akan lagi menerima SIGINT pada Ctrl-C(atau sinyal terkait keyboard lainnya seperti SIGTSTP, SIGQUIT). Namun bisa ditangguhkan jika mencoba membaca (mungkin menulis juga tergantung pada pengaturan perangkat terminal) dari perangkat terminal (seperti proses latar belakang lakukan).
Sebagai contoh:
tidak dapat diganggu dengan Ctrl-C. Di atas
perl
akan mencoba untuk bergabung dengan grup proses yang ID-nya sama dengan ID proses induknya. Secara umum, tidak ada jaminan bahwa ada grup proses dengan id itu. Tetapi di sini, dalam kasusperl
perintah dijalankan sendiri pada prompt shell interaktif, ppid akan menjadi proses shell dan shell biasanya sudah dimulai dalam grup prosesnya sendiri.Jika perintah belum menjadi pemimpin grup proses (pemimpin grup proses latar depan), maka memulai grup proses baru akan memiliki efek yang sama.
Misalnya, tergantung pada shell,
akan memiliki efek yang sama.
ps
danperl
dimulai pada grup proses latar depan, tetapi pada kebanyakan shell,ps
akan menjadi pemimpin grup tersebut (seperti yang terlihat padaps
output di atas di mana pgid keduanyaps
danperl
merupakan pidps
), sehinggaperl
dapat memulai grup prosesnya sendiri.Atau bisa mengubah grup proses latar depan. Pada dasarnya beritahu perangkat tty untuk mengirim SIGINT ke beberapa grup proses lainnyaCtrl+C
perl -MPOSIX -e 'tcsetpgrp (0, getppid) atau mati $!; tidur 5 '
Di sana,
perl
tetap berada dalam grup proses yang sama tetapi sebaliknya memberi tahu perangkat terminal bahwa grup proses latar depan adalah ID yang sama dengan ID proses induknya (lihat catatan di atas tentang itu).sumber
hdparm
atausmartctl
pada hard disk yang rusak yang tidak merespons, mereka akan menggantung selamanya, dan Anda tidak dapat membunuhnya dengan CTRL + C. Anda dapat mengetahui apakah suatu proses berada dalam tidur yang tidak pernah terputus dengan melihat kolom statps aux
atau di kolom S daritop
/htop
-D
cara yang tidak pernah terputus tidur. Ini tidak selalu merupakan hal yang buruk, itu bisa berarti bahwa prosesnya melakukan banyak IO.