EnderUNIX Team.


EnderUNIX İpucu

Arkadaşıma gönder , Ana Sayfa

[ Linux ]

"Nohup ve Disown Kullanimi" - Ugur Engin - (2012-02-02 23:57:25)   [13394]

Kabuk üzerinde yapılan işlemler, bir parent proses altında kendine ait bir child proses içerisinde çalışır.Örneğin bash kabuğunda bir oturumunuz var ve bir script çalıştırıyorsunuz oturum kapandığı esnada çalışır durumda olan ilgili script de sonlanır.Teorik olarak kapanma sebepleri şöyle izah edilebilir.Oturum açıldığı esnada bir parent proses açılır ve yapılan ek işlemler bu proses'e child proses olarak bağlanır.Dolayısıyla oturum kapatıldığı esnada herhangi bir script çalışır durumda olsa bile parent proses, 1 numaralı "SIGHUP" sinyalini alacağı için kısa bir süre içerisinde kendine bağlı olan child proses'leri de sonlandıracaktır.Ancak 'nohup' gibi hareket eden bir araç ile scriptler çalıştırılır ise durum tam anlamıyla farklı bir hal alır ve oturum kapansa bile proses sonlanmaz.
Nohup, çalıştırılan işlemlere ait child proses'leri, en yukarıda bulunan 1 numaralı parent prosese migrate eder ve gelebilecek hup sinyallerinden child prosesleri korur. Dolayısıyla oturum kapansa bile çalışan işleme ait proses, 1 nolu parent proses altına migrate edilerek arka planda sonlanana kadar çalışması sağlanır.Çalıştırılacak uygulama veya komuta ait proses, tıpkı açılan her bir proses gibi yüksek seviyeli bir öncelik ile çalışır.(" high priority number ")
Bu durumda nohup içerisine nice -n argumanı eklenerek açılacak yeni proses'in en düşük seviyede(19) veya daha farklı seviyelerde çalışması sağlatılabilir.Aşağıda, bu durumu irdeleyen örnek bir komut kullanılarak sonucu hemen alt kısmına eklendi.

nohup nice -n 19 seq 1 9999999999 > /tmp/out &

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28544 root 36 19 61496 616 540 R 45.3 0.1 0:11.32 seq


NI: Proses çalışma önceliği(Process priority)

Bu durumda, 1 numaralı parent proses'e migrate olan 28544 nolu yeni proses'in çalışma önceliği 19 ile set edilerek en alt seviyede çalışması sağlandı.Artık bu proses, cpu kullanımını minumum seviyede tutacağı gibi yoğun bir sistem üzerinde diğer proses'lerin altında çalışarak sistem kaynaklarını da yormayacaktır.

Bu arada, nohup belirtilen amaçlar için tek çözüm değildir.Bash kabuğu üzerinde desteklenen 'disown' isimli bir komut daha vardır ki çalıştırılan proses'e ait job number'a göre hareket eder ve yine nohup ile aynı işlevi yapar.Fakat disown ile çalıştırılacak komut veya script betiği, bir sh dosyasına eklenerek çalıştırılmalıdır.

Örnek:

touch test.sh && echo "nice -n 19 seq 1 9999999999 > /tmp/out" > test.sh && ls -l test.sh && echo $?

-rw-r–r– 1 root root 39 Jan 29 23:44 test.sh
0


Yukarıdaki komut ile "nice -n 19 seq 1 9999999999 > /tmp/out" tırnak içerisinde belirtilmiş olan komutu; string bir ifade gibi, test.sh isimli yeni bir dosya oluşturularak içerisine yazılmasını sağlıyoruz.Bu işlem esnasında dosya kontrolü ve herhangi bir hata dönecek mi diye de "$?" ifadesi ile kontrol ediyoruz.

test.sh isimli dosyanın disown edilme aşaması ve ps ile proses kontrolü.sh test.sh &
[1] 28978
[root@matrix tools]# disown -h

ps -aux | grep seq
Warning: bad syntax, perhaps a bogus ‘-’? See /usr/share/doc/procps-3.2.7/FAQ
root 28979 87.9 0.1 61496 612 pts/0 RN 06:30 0:49 seq 1 9999999999

Şuanda disown edilen script, en tepede bulunan 1 numaralı parent proses'e migrate edilerek arka planda çalışmaya başladı.Artık shell session kapatılsa dahi işlemler arka planda çalışmaya devam ediyor olacaktır.

Detaylar:

“man bash”

Arkadaşıma gönder , Ana Sayfa