Ketika Anda mencoba untuk menghentikan proses untuk selamanya, opsi untuk "membunuh" apa yang harus Anda gunakan?

26

Saya mendapatkan banyak pesan campuran dari orang-orang, dan bertanya-tanya apakah sebenarnya tidak ada banyak perbedaan dalam apa yang Anda gunakan.

kill 'x'
killall 'x'
kill -9 'x'

Ini adalah beberapa opsi yang telah saya perintahkan untuk digunakan sejauh ini, tetapi beberapa orang mengatakan bahwa membunuh -9 hanya berlebihan, membunuh dengan sendirinya tidak bekerja, dll.

Apakah ada yang punya saran yang harus digunakan dalam kasus paling standar hanya mengakhiri proses (dan dengan demikian keadaannya juga)?

Saya sedang mencari apa yang harus digunakan ketika Anda ingin menghentikan pelaksanaan proses Anda sehingga Anda dapat menjalankan yang baru, baru dari awal

Chuck Testa
sumber
1
Lihat juga surat formulir UUK9 yang memperingatkan agar tidak disalahgunakanSIGKILL .
jw013
1
Untuk membuat daftar semua sinyal yang berbeda, beserta nomornya: kill -ldan untuk menerjemahkan nomor ke nama sinyal yang sesuai misalnya kill -l 9akan kembali KILL.

Jawaban:

24

Ada sejumlah sinyal yang disposisi defaultnya adalah untuk menghentikan proses. Sinyal terminasi terakhir adalah SIGKILL karena tidak dapat ditangani dan proses tidak memiliki pilihan selain mati. Namun ini juga berarti bahwa jika Anda mengirimnya, proses tersebut kehilangan kesempatan untuk membersihkan. Oleh karena itu, perilaku yang baik perlu mengirim sinyal seperti SIGTERM yang dapat ditangani terlebih dahulu dan hanya jika prosesnya tidak keluar setelah beberapa waktu mengirimkannya SIGKILL.

Perhatikan bahwa SIGINT dan SIGQUIT bukan kandidat yang baik untuk penghentian proses sewenang-wenang. Karena fakta bahwa mereka dapat dihasilkan dari keyboard terminal, banyak aplikasi menggunakannya untuk tujuan khusus. Misalnya, interpreter python menggunakan SIGINT untuk menghasilkan KeyboardInterruptpengecualian (juga dalam sesi python interaktif di mana ia hanya kembali ke prompt) dan JVM menggunakan SIGQUIT untuk membuang jejak stack. SIGINT dan SIGQUIT tetap efektif untuk sebagian besar utilitas baris perintah standar seperti findatau cat.

Selama shutdown sistem, sebagian besar sistem UNIX dan Linux mengirim SIGTERM ke semua proses, diikuti oleh 5 detik menunggu, diikuti oleh SIGKILL. Ini adalah cara yang disarankan untuk mematikan proses arbitrer dengan aman.

Perhatikan juga bahwa bahkan SIGKILL mungkin tidak menghentikan proses yang macet dalam menunggu tanpa gangguan sampai proses bangun.

Adam Zalcman
sumber
1
Jawaban yang sangat bagus. Apakah Anda memiliki referensi untuk kill -SIGTERM $pid; sleep 5; kill -SIGKILL $pid;rekomendasi?
l0b0
+1 jenis jawaban. Dan bagaimana dengan SIGHUP?
Alois Mahdal
2
@AloisMahdal: SIGHUPberasal dari hari ketika saluran dial-up umum digunakan. Sinyal itu dikirim untuk menunjukkan bahwa saluran terputus. Kemudian, ketika itu kurang umum SIGHUPkadang-kadang digunakan oleh daemon untuk membaca kembali file konfigurasi tanpa memulai kembali proses. Di zaman modern SIGHUPini jarang digunakan. Banyak daemon akan memiliki cara sendiri untuk menginisialisasi ulang (yaitu, apachectl gracefulatau rndc reconfig. Untuk hal-hal yang tidak boleh Anda gunakan [init.d|smf|upstart|launchd]kontrol jika memungkinkan.
bahamat
13

Anda harus mulai dengan yang paling lembut dan naik dari sana. Ini berarti, SIGINT, SIGTERM, SIGQUIT, SIGKILL. Meskipun kebanyakan orang melewatkan SIGINT dan SIGQUIT.

Ignacio Vazquez-Abrams
sumber
Selain itu beberapa aplikasi (seperti JDK) menangani SIGQUIT secara berbeda. Saya mungkin tidak akan menggunakan SIGQUIT tanpa mengetahui bagaimana aplikasi spesifik menanganinya.
dimo414