Bu yazıda, linux konsol üzerinden betik ve programları nasıl arka planda çalıştırılacağını, arka planda çalışanlar ile nasıl işlem yapılacağını (geri getirmek, kapatmak, listelemek gibi) ve oturum kapansa bile programın nasıl çalışır şekilde bırakılabileceğinden bahsedeceğim. Senaryoyu şu şekilde kuralım, ssh ile sunucuya bağlanıp, sürekli arkaplanda çalışmasını istediğiniz bir betiği çalıştıracaksınız. Bu betik listener, servis, log yazılımı ve bunun gibi bir çok işe yarıyor olabilir. Sürekli çalışacak olan betiğimizi hazırlayalım adı servis.sh olsun:
#!/bin/bash
while true
do
echo "test" >> /dev/null
done
Burada /dev/null yerine bir dosyaya da yazdırabilirsiniz, böylece işlemlerin devam edip etmediğini, dosyanın içeriğine bakarak anlayabilirsiniz. Eğer dosyaya test yazıyorsa işlem devam ediyordur. Çalıştırma için gerekli yetkiyi verelim:
chmod +x servis.sh
Çalıştıralım:
bash servis.sh
Program çalışmaya başladı ve sürekli bir döngü içinde olduğundan tekrar terminali kullanarak işlem yapabilmeniz için programı sonlandırmanız gerekmekte. Bu ufak betiği arkaplana göndermek için çalıştırdıktan sonra ctrl +z tuşlarına basmanız yeterli.
> root@x:~# bash servis.sh
> ^Z > [1] + Stopped bash servis.sh > root@x:~#
Artık terminali kullanmaya devam edebilirsiniz, betik arkaplanda atıldı. Process listesinde de görebilirsiniz
ps -aux çıktısında:
root 21949 0.3 0.0 4256 1168 pts/1 T 14:12 0:00 **bash servis.sh**
Betikğin durumunun stopped olduğunu farketmişsinizdir. Ctrl +z ile betiği sadece arkaplana attık. Bu betiği çalışır hale getirmek için bg komutunu kullanacağız:
root@x:~# bg 1 > [1]+ bash servis.sh &
root@x:~#
Buradaki 1 arkaplanda çalışan betiğin numarası, birazdan değineceğim. Arkaplanda çalıştırmanın bir diğer yöntemi ise komutun sonuna & karakteri koymaktır.
bash servis.sh &
Her iki şekilde de artık betik arkaplanda çalışıyor. Arka planda çalışan bütün işleri listelemek için jobs komutunu kullanabilirsiniz
jobs
Çıktı:
Running bash servis.sh & > [2]+ Running bash servis.sh &
[ ] içindeki numara çalışan processin numarasıdır, bg komutu buradaki numarayı kullanır. Bu processlerden herhangi birini tekrar konsola getirmek için fg komutu kullanacağız:
root@x:~# fg 1
bash servis.sh
Bu komut ile betik tekrar terminale geri döndü. Ctrl +z ile geri plana atabilir ve bg komutu ile çalışmasına devam etmesini sağlayabiliriz. Arka planda çalışan processleri durdurmak için, process id leri ile kill edebilir veya direk olarak kill %NUMARA şeklinde processi öldürebiliriz.
root@x:~# jobs -p
22177
22224
root@x:~# kill 22177 22224
veya
root@x:~# kill %1 %2
root@bt:~# jobs
> [1]- Terminated bash servis.sh
> [2]+ Terminated bash servis.sh
root@x:~# Artık istediğimiz işlemi geri plana atabiliyor, öne getirebiliyor, geri plandaki işlemleri listeyebiliyor ve durdurabiliyoruz. Ama geri planda çalışan bütün bu işlemler sizin o anki oturumunuza bağlıdır. Eğer oturumunuz kapatırsanız bütün bu processler otomatik olarak ölür. İşlemleri arkaplanda oturumdan bağımsız olarak yani, siz terminali kapattığınızda bile çalışmasına devam etmek için nohup komutunu kullanabilirsiniz.
nohup bash servis.sh &
Yukarıdaki komut ile servis.sh hem arka planda çalışacak (& sayesinde) hem de siz oturumu kapatsanız bile çalışmaya devam edecektir. (nohup) Bunun için kullanacağınız diğer bir komut ise screen:
screen bash servis.sh
Bu komut ile sanal bir terminal oluşturup komutu bu terminal üzerinde çalıştırıyorsunuz, açık terminali geri plana atmak için ctrl +a+d tuşlarına basmalısınız.
root@x:~# screen -ls
There is a screen on: > 22635.pts-0.bt (02/18/2013 02:38:04 PM) (Detached)
Komutu ile çalışan screenleri listleyebilirsiniz ve
screen -r 22635 ile bu ekrana geçiş yapabilirsiniz.
Herkese iyi çalışmalar.