Wednesday, June 26, 2013

Bash, Surec Idaresi

Komut satirindan surec kontrolu, idaresi gibi isler icin Unix bash'in guzel ozellikleri var. Bash icin bir script'i sh script.sh ile degil bash script.sh olarak isletmek gerekli. Mesela

set -m # Enable Job Control
for (( i = 0; i < $2; i++ ))
do
    cmd="baz komut "
    cmd+=" ";cmd+=$2;cmd+=" ";cmd+=$i
    if [ $1 == "secim1" ]; then
        xterm -hold -e $cmd &
    fi
    if [ $1 == "secim2" ]; then
        $cmd &
    fi
done
wait
echo "hepsi tamam"

...

Ustteki script icinde surec kontrolu (job control) icin -m en basta tanimlanmali.

Diyelim ki bu script'e verilen birinci secenek (yani $1) ile bir string veriyoruz, ve string uzerinde if..else irdelemesi yapilarak script farkli seyler yapabiliyor. Ayrica baz bir komuta ek string'leri dinamik olarak ekleyerek dinamik bir komut olusturabiliyoruz. Isletmek icin mesela

bash test.sh secim1 2

Ikinci secenek ile (yani $2) ile bir sayi veriyoruz diyelim, bu sayi kadar bir dongu baslatabiliriz, ve dongude her indis icin baska "alt komutlari" arka planda isletebiliriz. Birinci secenek her komut icin xterm baslatmak, ya da pur arka planda "sessiz olarak" isletmeyi kontrol ediyor olabilir.

Bash surec kontrolunun guzel tarafi, mesela wait komutu ile bu arka plana atilmis tum surecler bitene kadar ana script'in bekleyebilme ozelligidir. Belki tum alt komutlar bitince bazi ek birlestirme, vs. islemleri yapilacaktir. Onlari yapmanin en uygun yeri burasi, yani hemen wait sonrasi. Bunu test etmek icin su script'e bakalim

set -m # Enable Job Control
echo "1 saniye bekle..."
sleep 1 &
echo "3 saniye bekle..."
sleep 3 &
wait
echo "hepsi tamam"


Bu script isletilence 3 saniye bekleme olacaktir, 1 saniyelik "uyku (sleep)" komutu bitmis olsa bile 3 saniyelik olanin bitmesi beklenecektir. Ve (and), yani & isareti bilindigi gibi Unix'te bir komutu arka plana atmaya / isletmeye yarar (background process).

No comments: