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.