DEV Community

Ali Orhun Akkirman for Açıklab

Posted on

Supervisor süreç yöneticisi

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.

Image description

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
Enter fullscreen mode Exit fullscreen mode

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 
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ve tabi ki bu dosyaya çalıştırma yetkisi verelim:

chmod +x /opt/ornekuygulama.sh
Enter fullscreen mode Exit fullscreen mode

Örnek olarak çalıştırmak için aşağıdaki komut ile her saniye çalıştığına emin olabilirsiniz:

bash /opt/ornekuygulama.sh
Enter fullscreen mode Exit fullscreen mode

Çı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!
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ayrıca servisin standart çıktısını takip etmek için aşağıdaki komut kullanılır.

sudo supervisorctl tail ornekuygulama
Enter fullscreen mode Exit fullscreen mode

Hata loglarını izlemek için de aşağıdaki komut kullanılabilir.

sudo supervisorctl tail ornekuygulama stderr
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Discussion (1)

Collapse
turker_tunali profile image
Türker TUNALI ⚡

Bizim ERP sistemi supervisor kullanıyor ama bir türlü çalışma dinamiklerini anlayamamıştım. Benim için çok faydalı oldu, teşekkür ederim.