Linux’ta sinyaller hangi işlere yarar?
Bu flood’da Linux’ta proseslerle dışarıdan iletişim kurmamızı sağlayan sinyallerden bahsedeceğim.
Linux’ta program çalıştıran çoğu kimse bir programı sonlandırmak için kill 3942
, killall my-app
komutlarını en az bir kez kullanmıştır. kill 3942
komutunu 3942
id'li prosesin sonlanmasını istediğimizde kullanırız. Burada aslında kill
komutu ile işletim sistemine, ilgili prosese iletilmek üzere bir sinyal gönderilir. İşletim sistemi, eğer bu mesaj prosesin ilgilendiği sinyallerden
biri ise bunu prosese iletir. Sinyal, prosesin ilgilenmediği bir sinyal ise işletim sistemi ilgili sinyalin önceden tanımlı davranışı ile gereğini yapar.
kill
komutu, adının aksine sadece bir prosesi öldürmek için gerekli sinyali gönderme işine yaramaz, sinyal göndermek üzere hazırlanmış genel amaçlı bir araçtır. Parametre verilmeden kullanılırsa proseslere graceful
biçimde çıkış yapmaları için SIGTERM
sinyalini gönderir.
kill
komutu ile gönderilebilecek sinyaller kill -l
ile listelenebilir.
Kill komutuna başka bir sinyal göndermek istersek ilgili sinyali kill
komutuna parametre olarak verebiliriz.
Aşağıda bc
- basic calculator
programı çalıştırılmış, pgrep
ile id'si bulunmuş ve -INT
parametresiyle SIGINT
gönderilmiştir.
İşletim sisteminin SIGTERM
için default davranışı prosesi sonlandırmak şeklindedir, ancak yaptıkları işin yarım kalmasını istemeyen prosesler işletim sistemine SIGTERM
sinyali ile ilgilendiklerini belirtip bu sinyalin kendilerine iletilmesini isteyebilirler. Bu şekilde prosesler, kapanış için gerekli hazırlıkları -örneğin yarım kalan işlerini tamamlamak, bir yere kayıt atmak gibi- yapabilirler. Bu durum işletim sistemi kapatılırken de yaşanır. İşletim sistemi çalışan bütün proseslere SIGTERM
sinyalini gönderir ve 5-10 saniye zaman tanır. Prosesler bu süre içinde kapanmazsa zorla
sonlandırılırlar. İşte buradaki zorla
sonlandırma SIGKILL
ile sağlanmaktadır.
Önceden muhakkak bir prosesin kill 3942
ile öldürülemediği ancak -9
parametresi ile öldürüldüğü bir durumla karşılaşmışsınızdır. Burada SIGTERM
ile güzellikle
öldürülemeyen proses -9
nolu SIGKILL
sinyali ile zorla öldürülmüş olmaktadır.
Şimdi ise yukarıda kill -l
ile listelediğimiz proseslerle iletişim kurmamıza yarayan diğer bazı önemli sinyalleri inceleyelim.
SIGHUP
, prosese konfigürasyonunun değiştiği dolayısıyla konfigürasyonunu yeniden okuması gerektiğini söylediğimiz sinyaldir. Bu sinyali göndererek prosesin konfigürasyon değişikliklerinde -eğer olabiliyorsa- yeniden başlatılması gerekliliğinin önüne geçmeye çalışırız.
SIGINT
(interrupt), shell'den başlattığımız bir proses çalışmaya devam ederken ctrl+C
'ye bastığımızda gönderilen sinyaldir.
SIGSEGV
, OS tarafından proses geçersiz bir işlem yürüttüğünde (kendine ait olmayan bir hafıza alanına erişme gibi) gönderilen sinyaldir.
SIGUSR1
ve SIGUSR2
programın kendi istediği gibi kullanması üzere verilen sinyallerdir. Örneğin uzun sürebilecek dd
komutunun kaç byte kopyaladığı ile ilgili bilgi almak istediğimizde prosese SIGUSR1
komutunu vererek aşağıdaki gibi ekranda ilerleme durumunu bastırabiliriz.