Mengirim kill -9 ke suatu proses tidak memerlukan kerja sama proses (seperti menangani sinyal), itu hanya mematikannya.
Anda mengira itu karena beberapa sinyal dapat ditangkap dan diabaikan mereka semua melibatkan kerja sama. Tetapi sesuai man 2 signal
, " sinyal SIGKILL dan SIGSTOP tidak dapat ditangkap atau diabaikan". SIGTERM dapat ditangkap, itulah sebabnya dataran kill
tidak selalu efektif - umumnya ini berarti sesuatu dalam handler proses menjadi serba salah. 1
Jika suatu proses tidak (atau tidak bisa) mendefinisikan handler untuk sinyal yang diberikan, kernel melakukan tindakan default. Dalam kasus SIGTERM dan SIGKILL, ini adalah untuk menghentikan proses (kecuali PID nya adalah 1; kernel tidak akan berakhir init
) 2 artinya file menangani, ditutup, memorinya dikembalikan ke kumpulan sistem, orang tuanya menerima SIGCHILD, anak yatim piatu anak-anak diwarisi oleh init, dll., sama seperti ia memanggil exit
(lihat man 2 exit
). Proses tidak lagi ada - kecuali jika berakhir sebagai zombie, dalam hal ini masih terdaftar di tabel proses kernel dengan beberapa informasi; itu terjadi ketika induknya tidakwait
dan menangani informasi ini dengan benar. Namun, proses zombie tidak lagi memiliki memori yang dialokasikan untuk mereka dan karenanya tidak dapat terus dijalankan.
Apakah ada sesuatu seperti tabel global dalam memori di mana Linux menyimpan referensi ke semua sumber daya yang diambil oleh suatu proses dan ketika saya "membunuh" suatu proses Linux hanya melalui tabel itu dan membebaskan sumber daya satu per satu?
Saya pikir itu cukup akurat. Memori fisik dilacak oleh halaman (satu halaman biasanya sama dengan potongan 4 KB) dan halaman-halaman itu diambil dari dan dikembalikan ke kumpulan global. Ini sedikit lebih rumit karena beberapa halaman yang dibebaskan di-cache jika data yang dikandungnya diperlukan lagi (yaitu, data yang dibaca dari file yang masih ada).
Halaman manual berbicara tentang "sinyal" tetapi tentu saja itu hanya abstraksi.
Tentu, semua sinyal adalah abstraksi. Mereka konseptual, seperti "proses". Saya bermain semantik sedikit, tetapi jika Anda maksud SIGKILL secara kualitatif berbeda dari SIGTERM, maka ya dan tidak. Ya dalam arti bahwa itu tidak dapat ditangkap, tetapi tidak dalam arti bahwa keduanya adalah sinyal. Secara analogi, sebuah apel bukanlah jeruk, tetapi apel dan jeruk, menurut definisi yang sudah ada sebelumnya, keduanya adalah buah. SIGKILL tampaknya lebih abstrak karena Anda tidak dapat menangkapnya, tetapi ini masih merupakan sinyal. Berikut adalah contoh penanganan SIGTERM, saya yakin Anda pernah melihat ini sebelumnya:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
void sighandler (int signum, siginfo_t *info, void *context) {
fprintf (
stderr,
"Received %d from pid %u, uid %u.\n",
info->si_signo,
info->si_pid,
info->si_uid
);
}
int main (void) {
struct sigaction sa;
memset(&sa, 0, sizeof(sa));
sa.sa_sigaction = sighandler;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &sa, NULL);
while (1) sleep(10);
return 0;
}
Proses ini hanya akan tidur selamanya. Anda dapat menjalankannya di terminal dan mengirimkannya dengan SIGTERM kill
. Ini memuntahkan hal-hal seperti:
Received 15 from pid 25331, uid 1066.
1066 adalah UID saya. PID akan berupa shell yang kill
dieksekusi, atau PID kill jika Anda bercabang ( kill 25309 & echo $?
).
Sekali lagi, tidak ada gunanya menetapkan handler untuk SIGKILL karena itu tidak akan berfungsi. 3 Jika saya kill -9 25309
proses akan berakhir. Tapi itu masih merupakan sinyal; kernel memiliki informasi tentang siapa yang mengirim sinyal , jenis sinyal apa itu, dll.
1. Jika Anda belum melihat daftar sinyal yang mungkin , lihat kill -l
.
2. Pengecualian lain, seperti yang disebutkan oleh Tim Post di bawah ini, berlaku untuk proses tidur yang tidak terputus . Ini tidak dapat dibangunkan sampai masalah mendasar diselesaikan, dan demikian pula SEMUA sinyal (termasuk SIGKILL) ditangguhkan untuk durasi tersebut. Namun, suatu proses tidak dapat menciptakan situasi itu dengan sengaja.
3. Ini tidak berarti menggunakan kill -9
adalah hal yang lebih baik untuk dilakukan dalam praktek. Handler contoh saya adalah yang buruk dalam arti bahwa itu tidak mengarah exit()
. Tujuan sebenarnya dari pengendali SIGTERM adalah untuk memberikan proses kesempatan untuk melakukan hal-hal seperti membersihkan file sementara, kemudian keluar secara sukarela. Jika Anda menggunakan kill -9
, itu tidak mendapatkan kesempatan ini, jadi hanya lakukan itu jika bagian "keluar secara sukarela" tampaknya telah gagal.
kill -9
Referensi wajib .