Apa tujuan dari opsi -9 dalam perintah kill?

Jawaban:

28

Halaman manual Ubuntu untuk killmenjelaskan tujuan -9sakelar (diakui dengan cara yang agak berombak):

Name     Num   Action    Description
KILL       9   exit      cannot be blocked

Inilah yang dikatakan halaman pria lain .

Perintah killmengirim sinyal yang ditentukan ke proses atau grup proses yang ditentukan. Jika tidak ada sinyal yang ditentukan, TERMsinyal dikirim. The TERMsinyal akan membunuh proses yang tidak menangkap sinyal ini. Untuk proses lain, mungkin perlu menggunakan sinyal KILL( 9), karena sinyal ini tidak dapat ditangkap.


Oleh karena itu, menggunakan -9sakelar memastikan bahwa prosesnya terbunuh secara efektif. Meskipun proses yang beku atau tidak merespons mungkin tidak merespons TERM sinyal sederhana , proses itu akan mati saat mengirim KILLsinyal.

TuanCharlo
sumber
40

The kill Perintah akan mengirimkan didefinisikan sinyal ke proses dengan identitas yang diberikan (PID):

kill -<signal> <pid>

Tentu saja kita hanya bisa membunuh proses yang kita miliki, sedangkan root dapat membunuh semua proses. Lihat Wikipedia untuk ringkasan sinyal komputasi yang bagus.

Sinyal yang killdapat dikirim tercantum di halaman manual . Sinyal dapat diwakili oleh nama atau nomor. Jika tidak ada sinyal diberikan sinyal default 15 resp. TERMdigunakan.

Karena itu ketiga perintah di bawah ini identik:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Perbedaan antara SIGTERMdan SIGKILLcara aplikasi bertindak pada sinyal:

  • TERM: aplikasi akan dapat berakhir, yaitu menjalankan rutin shutdown dengan benar.
  • KILL: aplikasi dihentikan dan dibunuh segera (yang dapat menyebabkan kehilangan data atau meningkatkan peluang untuk melaporkan dugaan kerusakan dalam beberapa kasus).
Takkat
sumber
16

Perhatikan bahwa semua berikut ini sama:

kill -9 1234
kill -KILL 1234
kill -SIGKILL 1234

Perlu ditunjukkan bahwa dalam dunia penanganan sinyal, SIGKILL adalah satu dari sedikit yang unik yang ditangani oleh sistem operasi, bukan programnya. Saat Anda menjalankan kill -9, Anda tidak memberi tahu aplikasi untuk menghentikannya sendiri, sebaliknya Anda memberi tahu OS untuk berhenti menjalankan program, apa pun yang sedang dilakukan program.

Setelah SIGKILL dikirim, program akan segera dihentikan. Jika ada panggilan kernel yang berjalan (mis. File IO) atas nama program, panggilan tersebut dapat atau tidak dapat dilanjutkan sampai selesai, tergantung pada panggilan, tetapi program itu sendiri tidak akan berjalan lagi. Perhatikan bahwa tugas yang dilacak atau tugas yang berjalan di bawah debugger mungkin berperilaku berbeda di sini.

Sinyal lain yang tidak dapat diblokir adalah SIGSTOP yang memiliki efek serupa, tetapi malah membekukan program; Anda dapat mengirim SIGCONT nanti untuk melanjutkannya. Perilaku ini sepenuhnya dikendalikan oleh OS, dan program tidak mendapatkan pemberitahuan sebelumnya.

Semua sinyal lain dikirim ke program; itu dapat menangani mereka bagaimanapun ia memilih, atau jika mengabaikan sinyal maka perilaku standar diikuti.

Berikut adalah beberapa sinyal berguna yang mungkin Anda temukan dikirim ke suatu proses:

  • SIGHUP - hangup
    Memberitahu program yang diputus pengguna (mis. Sesi SSH atau jendela terminal ditutup).
    Biasanya melakukan shutdown program dengan anggun.
  • SIGINT - interrupt
    Terkirim ketika Anda menekan CTRL+ C
    Biasanya berarti "hentikan apa yang Anda lakukan" - mungkin atau tidak dapat membunuh program
  • SIGTERM - terminate
    Default dikirim oleh killdan killall.
    Biasanya menghentikan program ... kadang-kadang setelah program selesai apa pun yang dilakukannya.
  • SIGSTOP - berhenti
    Terkirim ketika Anda menekan CTRL+ Z
    Menjeda program, dibahas di atas
  • SIGPIPE - pipa tertutup
    Memberitahu program bahwa pipa telah ditutup. Biasanya mengakhiri program.
    Misalnya cat /etc/passwd | head -n1akan mengirim SIGPIPE ke catproses setelah baris pertama dicetak, menyebabkan catterminasi sebelum menyelesaikan seluruh file.

Sementara semua sinyal ini terjadi "secara alami" dalam pengaturannya sendiri, Anda dapat menggunakan sinyal untuk memalsukan suatu kondisi untuk mencapai hasil yang diinginkan.

Misalnya, jika Anda ingin mengakhiri sesi SSH seseorang, Anda bisa mematikan prosesnya, tetapi dengan melakukannya Anda akan mencegahnya memperbarui file SEJARAH, yang mungkin penting untuk alasan keamanan. Tetapi sebaliknya jika Anda mengirimnya SIGHUP , maka proses akan menganggap koneksi telah mati dan akan melakukan pembersihan standar.

tylerl
sumber
Ctrl + \ mengirim SIGQUIT, di mana tindakan default adalah membuang inti dan mengakhiri. Ini dapat digunakan jika suatu program melakukan sesuatu yang sangat salah, Anda harus segera menghentikannya, dan ingin dapat melakukan debug nanti.
Simon Richter
@SimonRichter Oh, Anda benar. tetap.
tylerl
6

kill -9 Artinya: Proses akan dibunuh oleh kernel; sinyal ini tidak dapat diabaikan. 9 berarti sinyal KILL yang tidak dapat ditangkap atau diabaikan

Penggunaan: SIGKILL singal

Kill Meaning: Perintah kill tanpa sinyal melewati sinyal 15, yang menghentikan proses dengan cara normal.

Penggunaan: Sinyal SIGTERM , yang dapat ditangani oleh programmer

devav2
sumber