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.