GNU/Linux sistem yönetimi derslerinde de anlattığımız güzel bir konu "süreç" (process) kavramı ve bu süreçlerin yönetilmesi olarak düşünülebilir. Süreçler belirli işler için süreklilik oluşturulabilmesi için "servis" olarak oluşturulup kullanılması gerekebilir.
GNU/Linux ile tanıştığım dönemde ana dağıtımlarda "SystemV" adında temel işleri halledebilecek servis (.service) dosyaları ve bu servislerin yönetilmesi için "service" komutu kullanılmakta idi.
Daha sonrasında belirli eksiklikler sonrasında başka arayışlar başladı ve bir çok dağıtım "systemd" adı verilen bir altyapıyı tercih etmeye başladı. Bazı bağımlılıkları zorunlu kılması nedeniyle hala karşı olanların bulunmasına karşın kararlı bir servis yönetimi sağlamasından dolayı kullanımı benimsendi.
Bu süreç sırasında systemd kadar kapsamlı olmayan fakat bir çok işlemi yapabilen supervisor adında bir süreç yöneticisi de kullanılmaya başlandı. Genellikle geliştirilen uygulamaların kendi başına servis oluşturabilmesi için bağımsız bir yapıyı sunmasından dolayı hala kullanılmakta.
Bizim ihtiyacımız da "Docker" konteynır'larında systemd olmamasından dolayı çoklu servis yönetiminin sağlanması için altyapıyı sunmak olacak.
Supervisor
Öncelikle supervisor paketini kurduğumuz zaman içerisinde temel olarak 3 katman olduğunu görebiliriz.
Birincisi cli uygulaması olarak kullanılabilen "supervisorctl" uygulaması. Diğeri systemd ile de yönetilebilen "supervisord" servisi ve sonuncusu da "/var/run/supervisor.sock" adresinde bulunan supervisor soket dosyası.
Supervisor Kurulumu
Supervisor paketini Ubuntu ve Debian tabanlı sistemlerde kurmak için aşağıdaki komutu kullanmak yeterli.
sudo apt install supervisor
Bu adımdan sonra yukarıda bahsettiğim gibi aşağıdaki komut ile genel amaçlı sistemlerde servisin ayağa kalkıp kalkmadığını görebilirsiniz. Docker üzerinde kullanırken buna gerek olmadığını başka bir yazıda detaylıca anlatacağım.
sudo systemctl status supervisor
Supervisor temel yapılandırma ayarları
Supervisor için yapılandırma temel dosyası "/etc/supervisor/supervisord.conf" olup, ek yönetilecek süreçler için "/etc/supervisor/conf.d/" klasörü içerisine eklenecek ".conf" dosyalar ile kontrol edilemektedir.
Örnek basit bir uygulama
Sürecin kendisi
Elimizde her saniye ekrana tarih ve saati yazan ve örnek bir error çıktısı veren bir betik olduğunu varsayalım bunu da "/opt/ornekuygulama.sh" olarak kaydettiğimizi düşünelim.
#!/bin/bash
while true
do
echo `date`
echo 'error!' >&2
sleep 1
done
Ve tabi ki bu dosyaya çalıştırma yetkisi verelim:
chmod +x /opt/ornekuygulama.sh
Örnek olarak çalıştırmak için aşağıdaki komut ile her saniye çalıştığına emin olabilirsiniz:
bash /opt/ornekuygulama.sh
Çıktı olarak her saniye aşağıdaki gibi bir çıktı verdiğine emin olduktan sonra CTRL+C ile kapabiliriz.
Sun Jul 3 10:31:02 UTC 2022
error!
Sun Jul 3 10:31:03 UTC 2022
error!
Sun Jul 3 10:31:04 UTC 2022
error!
Servisleştirme
Gördüğümüz gibi süreci başlattığımızda kendisi bir şekilde çalışmaya devam ediyor fakat bu süreci yönetmek istersek elimizde kısıtlı imkanlar bulunmakta. Bu nedenle süreci servisleştirmemiz gerekmekte.
Bunun için yukarıda bahsettiğimiz yapılandırma klasörü içerisinde aşağıdaki gibi bir dosya oluşturulması gerekiyor. İsim olarak da örnek olarak "/etc/supervisor/conf.d/ornekuygulama.conf" diyebilirsiniz.
command=/opt/ornekuygulama.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/ornekuygulama.err.log
stdout_logfile=/var/log/ornekuygulama.out.log
Satırlar çok anlaşılır olmasına rağmen kısaca bahsetmem gerekirse servisimizin çalıştıracağı sürecin komutu "command=" ile verilmekte. autostart ve autorestart da sistem açılırken ve süreç kapandığında yeniden başlaması için geçerli. Diğer ifadeler de standart çıktıyı log dosyasına yazdırma ve hata loglarını başka bir log dosyasına yazdırma için kullanılmakta.
Servislerin ayağa kaldırılması
Servis için oluşturduğumuz yapılandırma dosyalarını okuması için aşağıdaki komut çalıştırılmalı:
sudo supervisorctl reread
Bu şekilde oluşturduğumuz yapılandırma dosyaları available olarak gözükebilecektir. Servislerin güncellenmesi için ise aşağıdaki komutu vermeniz gerekmekte.
sudo supervisorctl update
Bu adımdan sonra servisiniz ayağa kalkması gerekmektedir. Yaşanacak sorunlar için log dosyaları takip edilebilir.
Servislerin temel yönetimi
Servislerin yönetimi systemd'ye benzer şekilde olmaktadır. Farklılık olarak aşağıdaki şekilde servis listesini görebilirsiniz:
sudo supervisorctl status
Ayrıca servisin standart çıktısını takip etmek için aşağıdaki komut kullanılır.
sudo supervisorctl tail ornekuygulama
Hata loglarını izlemek için de aşağıdaki komut kullanılabilir.
sudo supervisorctl tail ornekuygulama stderr
Systemd ile benzer şekilde servisi başlatma, durdurma ve yeniden başlatmak için aşağıdaki gibi komutlar kullanılabilir.
sudo supervisorctl start ornekuygulama
sudo supervisorctl stop ornekuygulama
sudo supervisorctl restart ornekuygulama