Sistem bir işleme ne zaman SIGTERM gönderir?


24

Sunucu programım bir SIGTERM aldı ve durdu (çıkış kodu 0 ile). Bunun için çok fazla bellek olduğundan emin olduğum için şaşırdım. Hangi koşullar altında linux (meşgul kutusu) bir işleme SIGTERM gönderir?


Çekirdek veya standart bir aracın SIGTERM'i rastgele bir işleme göndereceği zaman hiçbir şey düşünemiyorum. Programın ne yaptığı ve nasıl başladığı hakkında bize ne söyleyebilirsiniz? Programın çıkış durumunu nasıl öğrendiniz? Sorunu yeniden üretebilir misin? Kontrol edebileceğiniz kayıtlarınız var mı?
Gilles 'SO- kötülük' dur '17

Bir seri satıra okuyor ve yazıyor, UDP ve TCP taleplerine cevap veriyor. Yürütmeyi bir bash betiğine sardım ve bu nedenle çıkış kodunu biliyorum.
michelemarcon

1
Posix dokümantasyonu, SIGTERM'in kesinlikle bir kullanıcı seviyesi olayı olduğunu gösterir. Sunucu programınızı başkasının öldürmesi mümkün mü?
denizci

3
Sen! Dönüş kodu 0 normal çıkış anlamına gelir. Bir SIGTERM $?olsaydı, 143 (128 + sinyal numarası) olarak ayarlanırdı.
Gilles 'SO- kötülük' dur

1
Ayrıca, ^ C, SIGTERM değil
SIGINT'dir

Yanıtlar:


13

Bunu bir cevap olarak göndereceğim, eğer sorun ortaya çıkarsa, bir tür çözüm olması için.

0 çıkış durumu, başarılı bir programdan normal bir çıkış anlamına gelir. Mevcut bir program , çıkış durumu olarak 0 ile 255 arasındaki herhangi bir tam sayıyı seçebilir. Geleneksel olarak, programlar küçük değerler kullanır. Değerler 126 ve üstü, kabuk tarafından özel koşulları bildirmek için kullanılır, bu nedenle bunlardan kaçınmak en iyisidir.

C API seviyesinde, programlar hem programın çıkış durumunu hem de varsa onu öldüren sinyali kodlayan 16 bitlik bir durum rapor eder .

Kabukta, bir komutun çıkış durumu (kaydedilmiş $?) programın gerçek çıkış durumunu ve sinyal değerini sınırlar: eğer bir program bir sinyal tarafından öldürülürse, $?128'den büyük bir değere ayarlanır (çoğu kabukla, bu değer 128 artı sinyal numarası; ATT ksh 256 + sinyal numarası kullanır ve yash belirsizliği önleyen 384 + sinyal numarası kullanır, ancak diğer kabuklar buna uymamıştır).

Özellikle, $?0 ise, programınız normal şekilde çıkıldı.

Bunun, SIGTERM alan, ancak bunun için bir sinyal işleyicisine sahip olan ve sonunda normal olarak çıkan bir işlem vakasını içerdiğini unutmayın (belki de SIGTERM sinyalinin dolaylı bir sonucu olarak).


Başlığınızdaki soruyu yanıtlamak için, SIGTERM hiçbir zaman sistem tarafından otomatik olarak gönderilmez. Bir terminal kaybolduğunda otomatik olarak SIGHUP, bir işlem yapılmaması gereken şeyleri yaptığında SIGSEGV / SIGBUS / SIGILL, otomatik olarak kesilen bir boru / sokete yazarken SIGPIPE gibi gönderilen birkaç sinyal vardır. bir terminal bir tuşa basın nedeniyle gönderilir birkaç sinyaller, ağırlıklı olarak sigint Ctrl+ Ciçin SIGQUIT Ctrl+ \ve SIGTSTP Ctrl+ Zama SIGTERM onlardan biri değildir. Bir işlem SIGTERM alırsa, başka bir işlem bu sinyali gönderdi.

Speaking kabaca konuşma


Bir sinyal alındığında çıkış durumunun nasıl belirlendiğine dair güzel bir açıklama. Ancak bu cevap OP'nin sorusunu ele almıyor.
codeforester

1
@ codeforester Vücuttaki soruyu cevapladım, başlıktaki soruyu değil. Peki, vücuttaki sorulardan biri - yanlış anlaşılmaya dayanması nedeniyle biraz dağınıktır. Gerisi hakkında birkaç kelime ekleyeceğim.
Gilles 'SO- kötülük olmayı'

Bu kabuğa bağlı. Ksh93, 256 + signum, yash, 384 + signum
Stéphane Chazelas

256'dan büyük bir değer kullanmanın la ksh'nin geçmesini engellediği için mutlaka daha iyi olmadığını unutmayın exit. yashYaklaşım iyi bir uzlaşmadır, ancak başka biri için rc bakın. Ayrıca bkz . İşlem sonlandırıldığında varsayılan çıkış kodu?
Stéphane Chazelas

10

SIGTERM, tipik olarak bir işlemi idari olarak sonlandırmak için kullanılan bir sinyaldir.

Bu, çekirdeğin göndereceği bir sinyal değil, bir sürecin tipik olarak başka bir işlemi sonlandırmak için göndereceği bir sinyaldir.

Yani tarafından varsayılan olarak gönderilen sinyali kill, pkill, killall, fuser -k... komutları.

Onları durdurmak için (a service some-service stop) 'da olduğu gibi ( veya initSIGTERM üzerine zamanında sonlandırmayı başaramayan süreçler için SIGKILL) ardından gönderilen (a da gibi ) daemlere gönderilen sinyal.

SIGTERM'in gönderilen sinyal olmadığını unutmayın ^C. Gönderilen sinyal ^CSIGINT.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.