Kill -9'u bir sürece göndermek, sürecin işbirliğini gerektirmez (bir sinyalin kullanımı gibi), sadece onu öldürür.
Bazı sinyallerin yakalanıp göz ardı edilebileceği için hepsinin işbirliği içerdiğini varsayıyorsunuz. Ancak man 2 signal
" SIGKILL ve SIGSTOP " sinyalleri yakalanamaz veya göz ardı edilemez ". SIGTERM yakalanabilir, bu nedenle düzlüğün kill
her zaman etkili olmasının nedeni budur - genellikle işlemin işleyicisindeki bir sorun gider. 1
Bir işlem verilen bir sinyal için bir işleyici tanımlamaz (veya yapamazsa) , çekirdek varsayılan bir eylem gerçekleştirir. SIGTERM ve SIGKILL söz konusu olduğunda bu, işlemi sonlandırmaktır (PID değeri 1 değilse, çekirdek sonlanmaz init
) 2 , dosya tanıtıcılarının kapalı olduğu, sistem havuzuna geri döndüğü, ebeveyninin yetimhanesi SIGCHILD'i aldığı anlamına gelir çocukların o aramıştı sadece sanki vb init tarafından devralınan exit
(bkz man 2 exit
). Süreç artık yok - bir zombi olarak bitmediği sürece, bu durumda çekirdeğin süreç tablosunda hala bazı bilgiler yer alıyor; Bu, ebeveyni olmadığında olurwait
ve bu bilgiyi doğru bir şekilde ele alınız. Ancak, zombi işlemlerinde artık kendilerine ayrılan bir bellek yoktur ve bu nedenle yürütülmeye devam edemez.
Linux'un bir işlem tarafından alınan tüm kaynaklara referansları tuttuğu ve bir işlemi "öldürdüğümde" Linux bu tablodan geçtiği ve kaynakları tek tek serbest bıraktığı bellekte global bir tablo gibi bir şey var mı?
Bence bu yeterince doğru. Fiziksel bellek, sayfa tarafından izlenir (genellikle 4 KB'lik bir parçaya eşit bir sayfa) ve bu sayfalar alınır ve genel bir havuza geri döndürülür. Bazı serbest sayfaların, içerdikleri verilerin tekrar gerekli olması durumunda (yani, hala mevcut bir dosyadan okunan veriler) önbelleğe alınması biraz daha karmaşıktır.
Manpages "sinyaller" hakkında konuşur, ancak bu kesinlikle bir soyutlamadır.
Elbette, tüm sinyaller bir soyutlamadır. Kavramsal, tıpkı "süreçler" gibi. Biraz anlamsal oyun oynuyorum, ancak SIGKILL'in SIGTERM'den niteliksel olarak farklı olduğunu düşünüyorsanız, evet ve hayır. Evet, yakalanamadığı anlamında, fakat her ikisi de sinyal olduğu için hayır. Benzetme yapmak gerekirse, bir elma bir portakal değildir, ancak önceden tanımlanmış bir tanımlamaya göre, her iki meyve de elma ve portakaldır. SIGKILL yakalayamadığınız için daha soyut görünüyor , ama yine de bir sinyal. SIGTERM kullanımına bir örnek: Bunları daha önce gördüğünüze eminim:
#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;
}
Bu süreç sonsuza kadar uyuyacak. Bir terminalde çalıştırabilir ve SIGTERM ile birlikte gönderebilirsiniz kill
. Gibi şeyler tükürür:
Received 15 from pid 25331, uid 1066.
1066 benim kimliğim. PID kill
, yürütüldüğü kabuğun kimliği veya eğer çatallamanız durumunda öldürme PID'si olacaktır ( kill 25309 & echo $?
).
Yine, SIGKILL için bir işleyici ayarlamanın bir anlamı yoktur çünkü işe yaramaz. 3 Eğer ben kill -9 25309
işlem biterse. Ancak bu hala bir sinyaldir; çekirdek, sinyali kimin gönderdiği , ne tür bir sinyal , vb. hakkında bilgi sahibidir .
1. Olası sinyaller listesine bakmadıysanız , bkz kill -l
.
2. Tim Post'un da belirttiği diğer bir istisna, kesintisiz uykudaki işlemler için geçerlidir . Bunlar, temel sorun çözülene kadar uyandırılamaz ve bu nedenle ALL sinyalleri (SIGKILL dahil) süresi için ertelenir. Ancak bir süreç bu durumu bilerek oluşturamaz.
3. Bu kullanmanın kill -9
pratikte yapılacak daha iyi bir şey olduğu anlamına gelmez . Örnek işleyicim, yol göstermediği anlamda kötü bir şey exit()
. Bir SIGTERM işleyicisinin asıl amacı, işleme geçici dosyaları temizleme, sonra gönüllü olarak çıkma gibi şeyler yapma şansı vermek. Eğer kullanırsanız kill -9
, bu şans yoktur, bu nedenle sadece "çıkış gönüllü" bölümünün başarısız gibi görünüyor eğer bunu.
kill -9
referans .