dersblog

Otomatik Program Başlamak, Unix, Linux

Unix, Servisleri Nasıl Başlatıyor?

Bazı programların bilgisayar açıldığı zaman "otomatik" olarak başlamasını istiyor musunuz? Mesela, bir Linux makinasını tamamen Oracle icin ayırdınız, ve Oracle, bilgisayar açılır açılmaz başlamalı. Sistem idarecisi olarak her seferinde oracle kullanıcısına girip, kaldır/indir yapmak istemiyorsunuz..

Windows dünyasında (Borg dünyasına benzer), Servisler (Services) denen kavramın benzeri lazım yâni.. Windows bunlari Unix'ten almıştır tabii, o yüzden bu kavramın aynısını bulmakta zorluk çekmeyeceğiz..

Unix'te bu işler ayartanım dosyaları ile yapılıyor. Biliyorsunuz Unix'te bütün idare işleri bir "metin dosyasına" bağlıdır. Böyle olması çok iyidir çünkü metin değiştirici programlar Perl ve Ruby ile, sistem idarecileri birçok şeyi aynı anda ve otomatik olarak yapabilirler.

Ayar dosyalarının nerede olduğuna gelelim..

Unix'te önemli dizin yerleri vardır. Mesela /etc/ bunlardan biridir. Çogu Unix versiyonu, /etc/ altına onemli ayartanım dosyalarını koyar. Yâni, bir script ile /etc/ altındaki dosyaları değiştirirseniz, sistemin işleyişi değişecektir. Dikkatli olun yani.

İndir/kaldır ayar dosyaları /etc/rc.d dizini altındadır. Buraya girip ls -al işletirseniz, aşağıdaki tabloyu görebilirsiniz.

drwxr-xr-x   10 root     root         4096 Sep 15 01:09 .
drwxr-xr-x   43 root     root         4096 Sep 15 01:23 ..
drwxr-xr-x    2 root     root         4096 Sep  6 15:51 init.d
-rwxr-xr-x    1 root     root         3219 Jul 10  2001 rc
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc0.d
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc1.d
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc2.d
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc3.d
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc4.d
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc5.d
drwxr-xr-x    2 root     root         4096 Apr  4 13:25 rc6.d
-rwxr-xr-x    1 root     root         3200 Sep 15 01:08 rc.local
..
..

rc kelimesinden sonra gelen sayı, "başlama seviyesini" belirtir. Bir Linux makinasını değişik kiplerde (modda) başlatmanız mümkündür. Meselâ çok önemli bir sistem bakımı gerekiyor ve bu bakım yapılırken hiçbir kullanıcının sisteme bağlanamaması lâzım. Başlama seviyesi 0 yada 1, bu iş için kullanılabilir.

Sistemi 4. başlama seviyesinde başlatmak demek, rc4.d altına girip, oradaki başlatma scriptlerini işletmektir. Şimdi rc4.d altında ne var görelim.

lrwxrwxrwx    1 root     root           14 Apr  2 13:36 K74ntpd
lrwxrwxrwx    1 root     root           16 Apr  2 13:38 K74ypserv
lrwxrwxrwx    1 root     root           16 Apr  2 13:38 K74ypxfrd
lrwxrwxrwx    1 root     root           15 Apr  2 13:34 S05kudzu
lrwxrwxrwx    1 root     root           18 Apr  2 13:34 S08ipchains
lrwxrwxrwx    1 root     root           18 Apr  2 13:34 S08iptables
lrwxrwxrwx    1 root     root           17 Apr  2 13:34 S10network
lrwxrwxrwx    1 root     root           16 Apr  2 13:33 S12syslog
lrwxrwxrwx    1 root     root           17 Apr  2 13:36 S13portmap
lrwxrwxrwx    1 root     root           17 Apr  2 13:37 S14nfslock
lrwxrwxrwx    1 root     root           18 Apr  2 13:33 S17keytable
lrwxrwxrwx    1 root     root           16 Apr  2 13:34 S20random
lrwxrwxrwx    1 root     root           15 Apr  2 13:34 S25netfs
lrwxrwxrwx    1 root     root           14 Apr  2 13:34 S26apmd

ipchains, syslog gibi programlar tanıdık gelebilir. Bu programların başlatıldıkları yer burası işte! Evet.. işin püf noktasına iyice yaklaşıyoruz değil mi?

Bir kavram daha kaldı: Bazi scriptlerin "K" ile, ötekilerinin "S" ile başladığını görüyorsunuz. Bunun sebebi nedir?

S "Start" icin K "Kill" için kullanılır, yani Başlat ve Durdur komutları için. Eğer Unix sistemi, rc4.d altındaki servisleri başlatmak istiyorsa, önce, rc4.d altinda ls S* benzeri bir komut işletecektir. Bu komut sadece "S" ile başlayan scriptleri toplar. Sonra Unix sistemi, bu scriptleri teker teker "start" kelimesini ekleyerek cağırır.

Aynı şekilde sistem kapanırken, Unix ls K* benzeri komut işletip, durdurmak için gerekli scriptleri toplar, ve onları "stop" kelimesini ekleyerek cağırır. Bu kadar.

Ayrı bir not: Niye çağirim yaparken "start" ve "stop" eklemek gerekiyor?

Bunun sebebini script içeriğine baktığımızda göreceğiz.

..
..
start() {
     echo -n $"Kaydediciyi baslatiyoruz.. "
..
..
stop() {
     echo -n $"Kaydediciyi durduruyoruz.. "
..
..
case "$1" in
start) ;; eger Unix start kelimesi gondermis ise
     start
     ;;
stop)
     stop eger Unix stop kelimesi gondermis ise
     ;;
status)
     rhstatus
     ;;
restart|reload)
     restart
     ;;
..
..

systemd

Eğer kendi yazdığımız bir program RPi (ya da herhangi bir Ubuntu) başlayınca otomatik başlasın istiyorsak systemd yöntemini kullanabiliriz [5]. Örnek olarak mesela bir python Flask servisinin başlatılmasını istiyoruz, program /home/pi/run.py altında. Bir systemd ayar dosyası yaratmak lazım, ona flask ismi verelim,

sudo nano /etc/systemd/system/flask.service

İçine sunları yazabiliriz,

[Unit]
Description=Flask Service
After=multi-user.target

[Service]
Type=idle
User=pi
ExecStart=/home/pi/myenv/bin/python3 /home/pi/flask.py
Restart=no

[Install]
WantedBy=multi-user.target
sudo chmod 644 /etc/systemd/system/flask.service
sudo systemctl daemon-reload
sudo systemctl enable flask.service

RPi tekrar başlayınca servisimizin işletildiğini göreceğiz.

Dikkat direk sistem seviyesindeki Python'u değil /home/pi/myenv altındakini işlettik, bu geliştirme ortamı virtualenv ile alakalı, detayları o yazıda bulabiliriz.

supervisord

Unix'te süreç (process) isletimi, onların takibi için faydalı bir program, süpervisord. Bu tür programların en çok aranan özelliklerinden biri eğer takip ettikleri program çökmüş ise onu tekrar başlatabilmeleri. Çok uzun süren bir toptan işleyici (batch) programı mesela tekrar başlatılabilir (restartable) yapabilirsiniz, ve eğer bir şekilde çökerse programı başlatınca kaldığı yerden devam eder, ve çöken programı tekrar başlatacak olan şey süpervisord gibi bir program olacaktır.

http://supervisord.org/index.html

Kurmak için en rahat yol

sudo easy_install supervisor

Alttaki

echo_supervisord_conf

komutu ile örnek bir ayar dosyası ürettirebilirsiniz.

Bir ornek

[supervisord]logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)logfile_maxbytes=50MB
        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10
           ; (num of main logfile rotation backups;default 10)
loglevel=info
                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ;
(supervisord pidfile;default supervisord.pid)nodaemon=false[program:mytest]
command=python -u /home/burak/data/scripts/test_supervisord.pyautorestart=trueuser=postgresredirect_stderr=truestdout_logfile=/tmp/test_supervisord.log

Bir mytest adında programı başlatıp kontrol ettiriyoruz, log dosyasını tanımlıyoruz, autorestart=true ile hatalı şekilde süreç çökerse tekrar başlat diyoruz, ve "hangi kullanıcı üzerinden" alt programın başlatılmasını gerektiğini bile tanımlayabiliyoruz. Bu durumda süpervisord root olarak başlatılmalı tabii, yoksa istediği diğer kullanıcıya geçiş yapamaz.

Baslatmak icin

sudo supervisord

komutu yeterli.

Kontrol edilen tüm programları (süpervisord ile beraber) oldurmek için supervisord'nin PİD'ini ps -eaf | grep süpervisord ile bulun, ve

sudo kill -SIGTERM [PID]

Not: Yukarıdaki program tanımında python'u -u seçeneği ile kullandık, bu seçenek ile "print" gibi stdout'a çıkan ifadeler derhal "dışarı atılıyor (flushed)". Bu yapılmazsa çocuk süreç işliyor ve ekrana mesaj basıyor olsa bile log'da hiç bir şey gözükmeyecektir.


Yukarı