Unix / Linux - Sinyaller ve Tuzaklar

Bu bölümde, Unix'teki Sinyaller ve Tuzaklar hakkında ayrıntılı olarak tartışacağız.

Sinyaller, önemli bir olayın meydana geldiğini belirtmek için bir programa gönderilen yazılım kesintileridir. Olaylar, kullanıcı isteklerinden yasadışı bellek erişim hatalarına kadar değişebilir. Kesme sinyali gibi bazı sinyaller, bir kullanıcının programdan normal kontrol akışında olmayan bir şey yapmasını istediğini gösterir.

Aşağıdaki tablo karşılaşabileceğiniz ve programlarınızda kullanmak isteyebileceğiniz genel sinyalleri listelemektedir -

Sinyal Adı Sinyal Numarası Açıklama
SIGHUP 1 Kontrol terminalinde askıda kalma veya kontrol sürecinin ölümü tespit edildi
SIGINT 2 Kullanıcı bir kesme sinyali gönderirse verilir (Ctrl + C)
SIGQUIT 3 Kullanıcı bir çıkış sinyali gönderirse verilir (Ctrl + D)
SIGFPE 8 Yasadışı bir matematiksel işlem yapılmaya çalışılırsa verilir
SIGKILL 9 Bir işlem bu sinyali alırsa hemen çıkmalıdır ve herhangi bir temizleme işlemi gerçekleştirmez.
SİGALRM 14 Çalar saat sinyali (zamanlayıcılar için kullanılır)
SİGTERM 15 Yazılım sonlandırma sinyali (varsayılan olarak öldürme ile gönderilir)

Sinyal Listesi

Sisteminiz tarafından desteklenen tüm sinyalleri listelemenin kolay bir yolu vardır. Sadece yayınlayınkill -l komut ve desteklenen tüm sinyalleri görüntüler -

$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

Gerçek sinyal listesi Solaris, HP-UX ve Linux arasında değişiklik gösterir.

Varsayılan Eylemler

Her sinyalin kendisiyle ilişkili varsayılan bir eylemi vardır. Bir sinyal için varsayılan eylem, bir komut dosyası veya programın bir sinyal aldığında gerçekleştirdiği eylemdir.

Olası varsayılan eylemlerden bazıları -

  • Süreci sonlandırın.

  • Sinyali görmezden gelin.

  • Çekirdeği boşaltın. Bu, adında bir dosya oluştururcore sinyali aldığında sürecin hafıza görüntüsünü içerir.

  • Süreci durdurun.

  • Durdurulmuş bir işleme devam edin.

Sinyal Gönderme

Bir programa veya komut dosyasına sinyal göndermenin birkaç yöntemi vardır. En yaygın olanlardan biri, bir kullanıcının yazmasıdırCONTROL-C ya da INTERRUPT key bir komut dosyası yürütülürken.

Düğmesine bastığınızda Ctrl+C anahtar, bir SIGINT betiğe gönderilir ve tanımlanan varsayılan eylem betiğine göre sona erer.

Sinyal iletmenin diğer yaygın yöntemi, kill commandsözdizimi aşağıdaki gibidir -

$ kill -signal pid

Buraya signal teslim edilecek sinyalin numarası veya adıdır ve pidsinyalin gönderilmesi gereken işlem kimliğidir. Örneğin -

$ kill -1 1001

Yukarıdaki komut, HUP veya kapatma sinyalini birlikte çalışan programa gönderir. process ID 1001. Aynı işleme bir kill sinyali göndermek için aşağıdaki komutu kullanın -

$ kill -9 1001

Bu, çalışan süreci öldürür process ID 1001.

Sinyalleri Yakalama

Bir kabuk programının yürütülmesi sırasında terminalinizde Ctrl + C veya Break tuşuna bastığınızda, normalde bu program hemen sonlandırılır ve komut isteminiz geri döner. Bu her zaman arzu edilen bir durum olmayabilir. Örneğin, temizlenmeyecek bir sürü geçici dosya bırakabilirsiniz.

Bu sinyalleri yakalamak oldukça kolaydır ve trap komutu aşağıdaki sözdizimine sahiptir -

$ trap commands signals

Burada komut , herhangi bir geçerli Unix komutu veya kullanıcı tanımlı bir işlev olabilir ve sinyal, yakalamak istediğiniz herhangi bir sayıda sinyalin bir listesi olabilir.

Kabuk betiklerinde tuzak için iki yaygın kullanım vardır -

  • Geçici dosyaları temizleyin
  • Sinyalleri yoksay

Geçici Dosyaları Temizleme

Tuzak komutunun bir örneği olarak, aşağıda, bazı dosyaları nasıl kaldırabileceğiniz ve ardından birisi programı terminalden iptal etmeye çalışırsa çıkabileceğiniz gösterilmektedir -

$ trap "rm -f $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 2

Kabuk programında bu tuzağın çalıştırıldığı noktadan, iki dosya work1$$ ve dataout$$ program tarafından sinyal numarası 2 alınırsa otomatik olarak kaldırılacaktır.

Bu nedenle, kullanıcı bu tuzak çalıştırıldıktan sonra programın çalışmasını kesintiye uğratırsa, bu iki dosyanın temizleneceğinden emin olabilirsiniz. exit takip eden komut rm gereklidir çünkü onsuz, sinyal alındığında yürütme programda kaldığı noktada devam eder.

1 numaralı sinyal hangup. Ya birisi kasıtlı olarak hattı kapatır ya da hat yanlışlıkla kesilir.

Sinyaller listesine sinyal numarası 1 ekleyerek, bu durumda belirtilen iki dosyayı da kaldırmak için önceki tuzağı değiştirebilirsiniz -

$ trap "rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit" 1 2

Artık satır kapanırsa veya Ctrl + C tuşuna basılırsa bu dosyalar kaldırılacaktır .

Tuzak için belirtilen komutlar, birden fazla komut içeriyorlarsa, tırnak içine alınmalıdır. Ayrıca kabuğun, trap komutunun çalıştırıldığı anda ve ayrıca listelenen sinyallerden biri alındığında komut satırını taradığına dikkat edin.

Böylece, önceki örnekte, değeri WORKDIR ve $$tuzak komutu yürütüldüğünde değiştirilecektir. Bu değişikliğin sinyal 1 veya 2 alındığında gerçekleşmesini istiyorsanız, komutları tek tırnak içine koyabilirsiniz -

$ trap 'rm $WORKDIR/work1$$ $WORKDIR/dataout$$; exit' 1 2

Sinyalleri Yoksaymak

Tuzak için listelenen komut null ise, belirtilen sinyal alındığında göz ardı edilecektir. Örneğin, - komutu -

$ trap '' 2

Bu, kesme sinyalinin yok sayılacağını belirtir. Kesilmesini istemediğiniz bir işlemi gerçekleştirirken belirli sinyalleri göz ardı etmek isteyebilirsiniz. Göz ardı edilecek birden fazla sinyali aşağıdaki gibi belirtebilirsiniz -

$ trap '' 1 2 3 15

Bir sinyalin göz ardı edilmesi için ilk argümanın belirtilmesi gerektiğine ve kendi başına ayrı bir anlamı olan aşağıdakini yazmakla eşdeğer olmadığına dikkat edin -

$ trap  2

Bir sinyali görmezden gelirseniz, tüm alt kabuklar da bu sinyali yok sayar. Bununla birlikte, bir sinyal alındığında gerçekleştirilecek bir eylem belirtirseniz, tüm alt kabuklar o sinyal alındığında yine de varsayılan eylemi gerçekleştirecektir.

Tuzakları Sıfırlama

Bir sinyal alındığında yapılacak varsayılan eylemi değiştirdikten sonra, ilk bağımsız değişkeni atlarsanız tuzakla tekrar değiştirebilirsiniz; yani -

$ trap 1 2

Bu, 1 veya 2 sinyallerinin alınması üzerine yapılacak eylemi varsayılana geri döndürür.