Supervisor süreç yöneticisi
Tags: supervisor, service, systemd, process
Published: 2022-07-03 10:58:00

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5j88dhh29t20ieh5wys.png)
 

# 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.

```bash
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.

```bash
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.

```bash
#!/bin/bash
while true
do 
        echo `date`
        echo 'error!' >&2
        sleep 1
done
```

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

```bash
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
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ı:

```bash
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.

```bash
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:

```bash
sudo supervisorctl status
```

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

```bash
sudo supervisorctl tail ornekuygulama
```

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

```bash
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.

```bash
sudo supervisorctl start ornekuygulama
sudo supervisorctl stop ornekuygulama
sudo supervisorctl restart ornekuygulama
```