30
Konuya ait anahtar kelimeler : Unix/Linux Signals Signals, Türkçe "Sinyaller" anlamına gelmektedir. BASH kendisine gelen sinyalleri yorumlayarak bir işlem gerçekleştirir. Sisteminizde bulunan sinyalleri görnek için "kill -l" komutunu kullanabilirsiniz. Çoğu Linux sistemlerde "man -k signal | grep list" yada "apropos signal | grep list" komutları ile sinyaller görüntülenebilir. Şimdi sistemimizde bulunan sinyalleri görelim.
[alax@alax script]$ 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 [alax@alax script]$
Yukarıdakine benzer bir çıktıyı görüyor olmalısınız. Burada her sinyalin belirli bir kodu ve görevi bulunmaktadır. BASH ve Sinyaller : Aşağıdaki sinyaller BASH ile gönderilebilen sinyallerdendir.
Ctrl+Cİptal etme sinyali. Ön planda çalışan işlemleri iptal etmek için SIGINT gönderir.
Ctrl+YAskıya alma sinyali. Terminalden okuma işlemi yapan işlemleri askıya alır. Kullanıcıya işlemi önplana yada arkaplana alma yada durdurma imkanı sunar. Sadece desteklenen sistemlerde kullanılabilir.
Ctrl+ZDurdurma sinyali. Ön planda çalışan işlemleri durdurmak için SIGTSTP gönderir.
kill: Türkçe "sonlandır,öldür,kapat" anlamlarına gelmektedir. Bu komut ile belirlenen işlemleri kökünden kapatabilirsiniz. Bazı sinyal parametreleri vardır, genel olarak bu sinyaller;
SIGHUP1Herhangi bir işlemin çalıştığı Terminal'in kapatılması durumunda gönderilir.
SIGINT2Klavyeden yarıda kesmek, iptal etmek.
SIGKILL9Kapatma sinyali.
SIGTERM15Kapatma, sona erdirme sinyali.
SIGSTOP17,19,23İşlemi DURDURMA sinyali.
SIGKILL ve SIGSTOP kullanımı oldukça iyi bir kullanım değildir. Her işlemin bir sırası ve düzeni olduğu gibi işlemlerin de bir kapanma sırası vardır. Temiz ve sade bir şekilde programlarınızı kapatamadığınız zaman son çare olarak bu sinyalleri kullanabilirsiniz. BASH ekranında "Ctrl+C" ile aktif işlemi kapatamıyorsanız, o zaman "kill -9 program_ID_numarasi" şeklinde kökünden programı sonlandırabilirsiniz. Şimdi bir örnek yapalım, aktif Terminal'i kapatmadan bir tane daha Terminal açalım ve bu son açtığımız Terminal'e ait ID numarasını komut satırında "echo $$" komutu ile bulalım. Daha sonra bu ID numarası ile ilk Terminal komut satırından ikinci Terminal'i kapatalım. Önce ikinci Terminal'i açalım ve aşağıdaki komutu çalıştıralım.
[alax@alax script]$ echo $$ 6111 [alax@alax script]$
Şimdi ilk Terminal komut ekranından bunu kapatalım. İki Terminal ekranını da göreceğiniz ölçüde küçültünüz ve ikinci Terminal'in nasıl kapandığını görünüz.
[alax@alax script]$ kill -9 6111 [alax@alax script]$
İkinci Terminal kapatıldı. Yada isterseniz herhangi bir progamın ID numarasını bularak kapatma işlemini yapabilirsiniz. "ps -ef" komutu ile çalışan bütün işlemleri ayrıntılı olarak listeleyebilirsiniz eğer belirli bir program arıyorsanız bunu "grep" bulabiliriz.
[alax@alax script]$ ps -ef | grep firefox alax 6367 1469 0 15:49 pts/0 00:00:00 grep firefox [alax@alax script]$
"6367" ID numaralı işlem Firefox'a ait. "kill -9 6367" komutu ile derhal kapatabiliriz. Trap : "Trap", Türkçe "Yakalamak" anlamında kullanılabilir. Bir script yazdınız ve komutlar işletilmeye başlandı fakat scriptinizi kullanan herhangi bir kullanıcının ani çıkış yapma durumları olabilir, ve bu scriptin hatalarla karşılaşmasına neden olabilir. Sizin programınızı kullanan kişi tamda işlemlerin ortasındayken programdan yanlışlıkla yada isteyerek çıkış yaptı diyelim, fakat önceden işletilen komutların sonucu olarak çıkan bazı veriler bir dahaki sefere scriptin çalışmasını engelleyebilir. İşte bu gibi durumlarda "trap" ile herhangi bir çıkış sinyali durumunda belirli komutları çalıştırabilirsiniz. Şimdi çalışma dizini içerisinde "trap.sh" adında bir scriptimiz olsun ve bu script şu şekilde çalışsın: - Script çalışmaya başladığı anda çalışma dizini içerisinde "kilitli" adında bir dosya oluştursun, ki aynı anda script birden fazla çalışmasın. Mesela aynı anda sisteme bir program kurmaya çalışılması durumunda olduğu gibi. - Eğer çalışma dizini içerisinde "kilitli" adında bir dosya mevcut ise "Script zaten çalışıyor.." mesajı versin, ve son olarak bu skript dosyayı silsin ve çıkış yapsın. Script içeriği aşağıdaki gibi olacaktır.
[alax@alax script]$ cat trap.sh #!/bin/bash # trap.sh dosya_adi="/home/alax/tux/script/kilitli" if [ -f "$dosya_adi" ]; then echo "Çalışma anahtarı kilitli..!!!" exit 0 fi touch $dosya_adi fonk () { echo "İşlem iptal edildi, kilit dosyası siliniyor..." rm $dosya_adi } trap fonk INT echo "Merhaba DÜnya.." sleep 15 exit 0
Şimdi script dosyasını çalıştırın ve hangi mesajın verildiğine bakın. Daha sonra çalışma dizini içerisinde "kilitli" adında bir dosya oluşturun ve scripti tekrar çalıştırın. Script çalışmaya başladığında "Ctrl+C" ile işlemi iptal edin sonuçları gözlemleyin. "Trap" kullanımı genel olarak bu şekilde olmaktadır. Son olarak "trap" kontrolünü "INT" iptal etme yerine "EXIT" çıkış yazarak deneyebilirsiniz.