SIGKILL ve SIGTERM arasındaki farkın iyi bir açıklaması (ve neden önce SIGTERM'i denemelisiniz)
Unix sisteminde kill kullanarak işlemlere sinyal göndermek çoğu sistem yöneticisi için yeni bir konu değildir, ancak kill ve kill -9 arasındaki fark hakkında birçok kez bana soruldu.
Bir işlemde kill'i her kullandığınızda, aslında işleme bir sinyal gönderirsiniz (neredeyse tüm durumlarda - yakında buna gireceğim). Standart C uygulamalarında, belirli bir sinyal alırsa işlemin izlemesi gereken adımları içeren bir başlık dosyası vardır. Man sayfasını öldürmek için kontrol ederek sisteminizdeki mevcut sinyallerin tam bir listesini alabilirsiniz.
Bunun gibi bir komut düşünün:
kill 2563
Bu, işleme SIGTERM adlı bir sinyal gönderir. Süreç bildirimi aldıktan sonra, birkaç farklı şey olabilir:
- süreç hemen durabilir
- kaynakları temizledikten kısa bir süre sonra süreç durabilir
- süreç süresiz olarak devam edebilir
Uygulama, bir SIGTERM alındıktan sonra ne yapmak istediğini belirleyebilir. Çoğu uygulama kaynaklarını temizleyecek ve duracak olsa da, bazıları olmayabilir. Bir uygulama, bir SIGTERM alındığında tamamen farklı bir şey yapacak şekilde yapılandırılabilir. Ayrıca, uygulama disk G / Ç'sini beklemek gibi kötü bir durumdaysa, gönderilen sinyal üzerinde işlem yapamayabilir.
Çoğu sistem yöneticisi, bir uygulama SIGTERM'e yanıt vermediğinde genellikle daha ani bir sinyale başvurur:
kill -9 2563
-9, kill komutuna SIGKILL adı verilen 9 numaralı sinyali göndermek istediğinizi bildirir. Böyle bir isimle, bu sinyalin biraz daha fazla ağırlık taşıdığı açıktır.
SIGKILL, SIGTERM ile aynı sinyal başlık dosyasında tanımlanmış olmasına rağmen, işlem tarafından göz ardı edilemez. Aslında, sinyal doğrudan çekirdek initine gittiğinden, işlem SIGKILL sinyalinden bile haberdar değildir. Bu noktada, init işlemi durduracaktır. Süreç asla sinyali yakalama ve ona göre hareket etme fırsatı elde etmez.
Ancak, çekirdek bazı durumlarda işlemi başarılı bir şekilde öldüremeyebilir. İşlem ağ veya disk G / Ç'sini bekliyorsa, çekirdek işlemi durduramaz. Zombi süreçleri ve kesintisiz bir uykuda yakalanan süreçler de çekirdek tarafından durdurulamaz. Bu işlemleri sistemden temizlemek için yeniden başlatma gerekir.
Thunderbird işlemlerine killall (SIGTERM) gönderdiğinizde, bu işlemlerin durdurulmasını istediniz. Bu süreçlerden bazıları doğru çalışmıyor (muhtemelen neden onları ilk başta öldürmeniz gerekiyordu), bu yüzden SIGTERM sinyalinde hareket edemediler.