Modern yazılım geliştirme dünyasında, uygulamaların arka planda kesintisiz çalışması hayati öneme sahiptir. Bir web sunucusu, bir kuyruk işleyici veya özel bir arka plan görevi olsun, bu süreçlerin sürekli ayakta kalması, olası hatalarda otomatik olarak yeniden başlatılması ve genel sistem kararlılığının sağlanması, sistem yöneticileri ve geliştiriciler için büyük bir zorluk teşkil edebilir. Peki, bu karmaşık süreç yönetimini nasıl basitleştirebilir ve uygulamalarınızın her zaman çalışır durumda olduğundan emin olabilirsiniz? İşte tam da bu noktada, açık kaynaklı bir süreç denetleme sistemi olan Supervisor devreye giriyor. Bu makalede, Supervisor’ı baştan sona nasıl kuracağınızı, yapılandıracağınızı ve yöneteceğinizi adım adım öğrenecek, böylece sunucu uygulamalarınızın güvenilirliğini ve verimliliğini artıracaksınız.
Süreç Yönetiminde Supervisor: Neden Vazgeçilmez Bir Araç?
Günümüzün dinamik dijital ortamında, bir uygulamanın sadece “çalışıyor” olması yeterli değildir; aynı zamanda her zaman “erişilebilir” ve “kararlı” olması da beklenir. Bir web uygulamasının arka planında çalışan bir veritabanı bağlantı havuzu, mesaj kuyruğu işleyicileri (örneğin Celery veya RabbitMQ), zamanlanmış görevler veya özel uzun süreli komut dosyaları gibi birçok kritik bileşen bulunur. Bu bileşenlerden herhangi birinin beklenmedik bir şekilde çökmesi veya durması, uygulamanın genel performansını ciddi şekilde etkileyebilir, hatta tamamen hizmet dışı kalmasına neden olabilir. İşte bu gibi senaryolarda, süreçlerinizi proaktif bir şekilde izleyen ve yöneten bir araca olan ihtiyaç kaçınılmaz hale gelir.
Supervisor, Python ile yazılmış hafif, güçlü ve esnek bir süreç denetleme sistemidir. Temel amacı, Linux benzeri işletim sistemlerinde daemon’ları (arka plan süreçleri) izlemek, başlatmak, durdurmak ve gerektiğinde otomatik olarak yeniden başlatmaktır. Geleneksel olarak, bu tür görevler genellikle init.d scriptleri, systemd veya cron gibi araçlarla yönetilirdi. Ancak Supervisor, özellikle çok sayıda uygulamanın ve sürecin bir arada çalıştığı karmaşık sistemlerde, bu yönetimi çok daha merkezi ve kullanıcı dostu bir hale getirir. Bir uygulamanın çökmesi durumunda, Supervisor bunu anında algılar ve önceden tanımlanmış kurallarınıza göre süreci otomatik olarak yeniden başlatarak hizmet kesintisini en aza indirir. Bu, özellikle yüksek erişilebilirlik gerektiren üretim ortamlarında paha biçilmez bir özelliktir. Ayrıca, her sürecin standart çıktı ve hata akışlarını ayrı ayrı log dosyalarına yönlendirme yeteneği sayesinde, sorun giderme ve hata ayıklama süreçleri de oldukça kolaylaşır.
Supervisor’ın sunduğu avantajlar sadece otomatik yeniden başlatma ile sınırlı değildir. Aynı zamanda süreç grupları oluşturma, her bir sürece özel ortam değişkenleri atama, süreçlerin başlangıç ve durdurma sıralarını kontrol etme gibi gelişmiş özellikler de sunar. Bu özellikler, özellikle mikroservis mimarileri veya birden fazla bağımlı bileşenin çalıştığı sistemlerde, uygulamanın yaşam döngüsünü tutarlı ve öngörülebilir bir şekilde yönetmek için kritik öneme sahiptir. Örneğin, bir veritabanı servisinin başlamasını bekleyen bir uygulama sürecini, veritabanı hazır olana kadar başlatmayacak şekilde yapılandırabilirsiniz. Bu sayede, uygulamanızın bağımlılıkları doğru sırada başlatılır ve potansiyel başlangıç hatalarının önüne geçilir. Kısacası, Supervisor, süreç yönetimini basitleştirerek sistem yöneticilerinin ve geliştiricilerin yükünü azaltır, uygulamaların daha güvenilir ve kesintisiz çalışmasını sağlar.
Supervisor Kurulumu ve İlk Adımlar: Sisteminizi Hazırlama
Supervisor’ı sisteminize kurmak ve ilk adımları atmak oldukça basittir. Genellikle Linux tabanlı sistemlerde kullanılır ve Python tabanlı olduğu için Python paket yöneticisi pip aracılığıyla veya dağıtımınızın paket yöneticisi ile kolayca kurulabilir. Bu bölümde, Ubuntu/Debian tabanlı bir sistemde kurulumu adım adım inceleyeceğiz ve ardından temel bir yapılandırma dosyası oluşturarak Supervisor’ı çalıştırmaya hazır hale getireceğiz.
Önkoşullar ve Kurulum Yöntemleri
Supervisor’ı kurmadan önce, sisteminizde Python’ın ve pip‘in kurulu olduğundan emin olmalısınız. Çoğu modern Linux dağıtımında Python varsayılan olarak gelir. Eğer pip kurulu değilse, aşağıdaki komutlarla kurabilirsiniz:
sudo apt update
sudo apt install python3-pip
Kurulum için iki ana yöntem bulunmaktadır:
- Sistem Paket Yöneticisi ile Kurulum (Önerilen): Bu yöntem, Supervisor’ın sisteminizle daha entegre çalışmasını sağlar ve genellikle daha kararlı bir deneyim sunar. Ubuntu/Debian için:
sudo apt install supervisor - Python Pip ile Kurulum: Eğer sistem paket yöneticinizde Supervisor’ın güncel sürümü yoksa veya daha spesifik bir Python ortamında çalışmak istiyorsanız
pipkullanabilirsiniz:pip install supervisorpipile kurduğunuzda, Supervisor’ın yürütülebilir dosyaları (supervisordvesupervisorctl) genellikle/usr/local/bindizinine veya Python sanal ortamınızınbindizinine yerleşir. Sistem paket yöneticisi ile kurduğunuzda ise genellikle/usr/binveya/usr/sbingibi standart sistem yollarında bulunurlar.
Kurulum tamamlandıktan sonra, Supervisor servisinin otomatik olarak başlatıldığından emin olmak için sistemd’yi kullanabilirsiniz. Eğer apt ile kurduysanız, genellikle servis otomatik olarak etkinleştirilir ve başlatılır. Eğer pip ile kurduysanız, kendi systemd servis dosyanızı oluşturmanız gerekebilir. Ancak apt ile kurulumda, servis genellikle zaten mevcuttur ve aşağıdaki komutlarla durumunu kontrol edebilirsiniz:
sudo systemctl status supervisor
Eğer servis çalışmıyorsa veya etkin değilse:
sudo systemctl enable supervisor
sudo systemctl start supervisor
Temel Yapılandırma Dosyası Oluşturma
Supervisor’ın ana yapılandırma dosyası genellikle /etc/supervisor/supervisord.conf veya /etc/supervisord.conf konumunda bulunur. apt ile kurulumda bu dosya otomatik olarak oluşturulur ve genellikle /etc/supervisor/conf.d/ dizinindeki diğer .conf dosyalarını da içe aktarır. Bu, farklı uygulamalar için ayrı ayrı yapılandırma dosyaları oluşturarak düzeni sağlamanıza olanak tanır. Yeni bir uygulama için yapılandırma oluştururken, genellikle /etc/supervisor/conf.d/ dizinine yeni bir .conf dosyası eklersiniz. Örneğin, my_app.conf adında bir dosya oluşturalım:
[program:my_app]
command=/usr/bin/python3 /path/to/your/app.py
directory=/path/to/your/app
autostart=true
autorestart=true
startretries=3
user=www-data
stdout_logfile=/var/log/supervisor/my_app_stdout.log
stderr_logfile=/var/log/supervisor/my_app_stderr.log
loglevel=info
Bu basit yapılandırma bloğu, Supervisor’a bir Python uygulamasını nasıl yöneteceğini söyler. [program:my_app] etiketi, yönetilecek sürecin adını tanımlar. command, uygulamanızı başlatan komuttur. directory, uygulamanızın çalışacağı dizini belirtir. autostart=true, Supervisor başladığında uygulamanın otomatik olarak başlamasını sağlar. autorestart=true ise, uygulama çökerse veya durursa Supervisor’ın onu otomatik olarak yeniden başlatmasını emreder. user parametresi, uygulamanın hangi kullanıcı altında çalışacağını belirler, bu genellikle güvenlik açısından önemlidir. Son olarak, stdout_logfile ve stderr_logfile, uygulamanızın standart çıktı ve hata akışlarının yazılacağı log dosyalarını tanımlar. Bu dosyalar, uygulamanızda bir sorun olduğunda hata ayıklama için kritik bilgiler içerir. Yapılandırma dosyanızı kaydettikten sonra, Supervisor’a yeni yapılandırmayı yüklemesini söylemek için supervisorctl komutunu kullanmanız gerekir.
Program Tanımlama ve Yönetimi: Supervisor ile Süreçlerinizi Kontrol Etme
Supervisor’ın gücü, süreçlerinizi detaylı bir şekilde tanımlama ve bunları merkezi bir noktadan yönetme yeteneğinde yatar. Bir önceki bölümde temel bir program tanımına değinmiştik. Şimdi ise, supervisord.conf dosyasında programları nasıl daha kapsamlı tanımlayacağımızı ve supervisorctl komut aracıyla bu süreçleri nasıl yöneteceğimizi daha yakından inceleyeceğiz. Her bir program tanımı, uygulamanızın ihtiyaçlarına göre özelleştirilebilen bir dizi parametre içerir, bu da Supervisor’ı inanılmaz derecede esnek kılar.
Program Yapılandırma Parametreleri
Her [program:program_adı] bloğu, ilgili sürecin davranışını kontrol eden çeşitli anahtar-değer çiftlerinden oluşur. İşte sıkça kullanılan bazı önemli parametreler ve açıklamaları:
command: Süreci başlatmak için çalıştırılacak tam komut. Örneğin,/usr/bin/python3 /var/www/myapp/app.pyveyaphp /var/www/myapp/artisan queue:work.directory: Sürecin çalışacağı çalışma dizini. Bu, uygulamanızın göreceli yolları doğru bulması için önemlidir.autostart: Supervisor başladığında bu programın otomatik olarak başlayıp başlamayacağını belirler (trueveyafalse). Genellikletrueolarak ayarlanır.autorestart: Program beklenmedik bir şekilde durduğunda Supervisor’ın onu otomatik olarak yeniden başlatıp başlatmayacağını belirler (true,falseveyaunexpected).unexpected, programın beklenen çıkış koduyla (genellikle 0) değil, başka bir kodla sonlandığında yeniden başlatılacağı anlamına gelir.startretries: Programın art arda kaç kez yeniden başlatılmaya çalışılacağını belirler. Bu sayı aşıldığında program “FATAL” durumuna geçer. Varsayılan değer 3’tür.startsecs: Programın “çalışıyor” olarak kabul edilmesi için kaç saniye boyunca sorunsuz çalışması gerektiğini belirtir. Bu süre içinde program durursa, bir hata olarak kabul edilir vestartretriessayacı devreye girer.user: Programın hangi sistem kullanıcısı altında çalışacağını belirler. Güvenlik açısından, uygulamaları root kullanıcısı yerine ayrıcalıksız bir kullanıcı (örneğinwww-dataveyanginx) altında çalıştırmak önemlidir.numprocs: Bu programdan kaç adet örnek çalıştırılacağını belirtir. Özellikle kuyruk işleyicileri gibi paralel çalışabilen uygulamalar için faydalıdır. Örneğin,numprocs=4.numprocs_start: Eğernumprocskullanılıyorsa, süreçlerin başlangıç indeksini belirler (varsayılan 0).process_name:numprocskullanıldığında her bir sürecin adını dinamik olarak oluşturmak için kullanılır. Örneğin,process_name=%(program_name)s_%(process_num)02d.stdout_logfile: Sürecin standart çıktısının (stdout) yazılacağı dosya yolu.stderr_logfile: Sürecin standart hata çıktısının (stderr) yazılacağı dosya yolu.environment: Süreç için özel ortam değişkenleri tanımlar. Örneğin,environment=ENV_VAR="değer",ANOTHER_VAR="başka_değer".stopsignal: Süreci durdurmak için gönderilecek sinyali belirler (örneğin,TERM,KILL,INT). VarsayılanTERM‘dir.stopwaitsecs: Sürecinstopsignalaldıktan sonra düzgün bir şekilde kapanması için beklenecek saniye sayısı. Bu süre sonunda kapanmazsaKILLsinyali gönderilir.
supervisorctl ile Süreçleri Yönetme
Supervisor’ın kalbi olan supervisord daemon’ı arka planda çalışırken, süreçleri yönetmek için supervisorctl komut satırı arayüzünü kullanırız. Bu araç, Supervisor’a komutlar göndermek ve süreçlerin durumunu izlemek için kullanılır.
Yeni bir program yapılandırması ekledikten veya mevcut bir yapılandırmayı değiştirdikten sonra, Supervisor’ın bu değişiklikleri algılaması için yapılandırma dosyalarını yeniden yüklemesini söylemeniz gerekir:
sudo supervisorctl reread
Bu komut, Supervisor’a yeni veya değiştirilmiş yapılandırma dosyalarını okumasını söyler. Ardından, bu değişiklikleri uygulamak için update komutunu kullanmalısınız:
sudo supervisorctl update
update komutu, yeni programları başlatır ve kaldırılan programları durdurur. Mevcut ve çalışan programların yapılandırmaları değiştiyse, bu programları yeniden başlatmanız gerekebilir. Diğer yaygın supervisorctl komutları şunlardır:
status: Tüm programların ve grupların mevcut durumunu gösterir.sudo supervisorctl statusstart program_adı: Belirtilen programı başlatır.sudo supervisorctl start my_appstop program_adı: Belirtilen programı durdurur.sudo supervisorctl stop my_apprestart program_adı: Belirtilen programı yeniden başlatır.sudo supervisorctl restart my_apptail -f program_adı: Belirtilen programın standart çıktısını gerçek zamanlı olarak izler.sudo supervisorctl tail -f my_appshutdown: Tüm Supervisor süreçlerini ve Supervisor daemon’ını durdurur. Dikkatli kullanılmalıdır.sudo supervisorctl shutdownreload: Supervisor daemon’ını durdurur ve yeniden başlatır, tüm programları yapılandırma dosyalarına göre yeniden başlatır. Bu da dikkatli kullanılmalıdır.sudo supervisorctl reload
Bu komutlarla, uygulamalarınızın yaşam döngüsünü tamamen kontrol edebilir, onları gerektiğinde başlatıp durdurabilir ve durumlarını kolayca izleyebilirsiniz. Supervisor, bu sayede sisteminizdeki tüm arka plan süreçleri için tek bir yönetim noktası sunarak operasyonel karmaşıklığı önemli ölçüde azaltır.
İleri Düzey Yapılandırma ve İzleme Teknikleri: Daha Sağlam Sistemler İçin
Supervisor, basit süreç yönetiminin ötesinde, daha karmaşık ve sağlam sistemler kurmak için kullanılabilecek bir dizi gelişmiş özellik sunar. Bu bölümde, süreç grupları oluşturmaktan olay dinleyicilerini yapılandırmaya, web arayüzünü etkinleştirmekten log yönetimine kadar çeşitli ileri düzey teknikleri inceleyeceğiz. Bu özellikler, özellikle büyük ölçekli veya yüksek erişilebilirlik gerektiren uygulamalar için Supervisor’ı vazgeçilmez bir araç haline getirir.
Süreç Grupları ([group:]) ile Düzen Sağlama
Birden fazla ilişkili süreciniz olduğunda (örneğin, bir web uygulaması için Gunicorn, Celery worker’ları ve bir beat scheduler), bunları ayrı ayrı yönetmek yerine bir grup altında toplamak çok daha pratiktir. Süreç grupları, tüm bu süreçleri tek bir komutla başlatmanıza, durdurmanıza veya yeniden başlatmanıza olanak tanır. Bir grup tanımlamak için supervisord.conf dosyanıza aşağıdaki gibi bir bölüm eklersiniz:
[group:my_app_group]
programs=web,worker,scheduler
priority=999
Burada, programs parametresi, bu gruba dahil edilecek programların adlarını virgülle ayırarak belirtir. priority ise, bu grubun diğer gruplara veya bağımsız programlara göre başlatılma/durdurulma önceliğini belirler. Daha yüksek öncelikli gruplar önce başlatılır, sonra durdurulur. Artık supervisorctl ile tüm grubu yönetebilirsiniz:
sudo supervisorctl start my_app_group:*
sudo supervisorctl stop my_app_group:*
sudo supervisorctl restart my_app_group:*
Bu, özellikle dağıtılmış sistemlerde veya birden fazla bileşenden oluşan uygulamalarda yönetim yükünü önemli ölçüde azaltır.
Olay Dinleyicileri ([eventlistener:]) ile Otomasyon
Supervisor, süreçlerde meydana gelen olayları (örneğin, bir programın başlaması, durması veya çökmesi) dinleyebilir ve bu olaylara yanıt olarak belirli komut dosyalarını çalıştırabilir. Bu özellik, özel bildirimler göndermek, sistem durumunu güncellemek veya karmaşık kurtarma senaryolarını otomatikleştirmek için kullanılabilir. Bir olay dinleyici tanımlamak için supervisord.conf dosyanıza aşağıdaki gibi bir bölüm eklersiniz:
[eventlistener:my_listener]
command=/usr/bin/python3 /path/to/your/event_handler.py
events=PROCESS_STATE_FATAL,PROCESS_STATE_STOPPED,PROCESS_STATE_EXITED
buffer_size=10
command, olayı işleyecek komut dosyasının yolunu belirtir. events, dinlenecek olay türlerini virgülle ayırarak listeler. Örneğin, PROCESS_STATE_FATAL bir sürecin ölümcül bir hata ile durduğunu, PROCESS_STATE_STOPPED düzgün bir şekilde durdurulduğunu ve PROCESS_STATE_EXITED ise normal bir şekilde sonlandığını gösterir. Olay işleyici komut dosyası, olay bilgilerini standart girişten okuyarak yanıt verebilir. Bu, Supervisor’ın esnekliğini artıran ve otomasyon yeteneklerini genişleten güçlü bir özelliktir.
Web Arayüzü ([inet_http_server]) ile Kolay İzleme
Supervisor, süreçlerinizi bir web tarayıcısı üzerinden izlemenizi ve yönetmenizi sağlayan basit bir web arayüzüne sahiptir. Bu arayüz, özellikle sunucuya SSH erişimi olmayan veya hızlı bir görsel genel bakışa ihtiyaç duyan durumlar için kullanışlıdır. Web arayüzünü etkinleştirmek için supervisord.conf dosyanızın [supervisord] bölümüne veya ayrı bir bölüme aşağıdaki satırları eklemeniz gerekir:
[inet_http_server]
port=127.0.0.1:9001
username=user
password=pass
port, web arayüzünün dinleyeceği IP adresi ve portu belirtir. Güvenlik nedeniyle genellikle 127.0.0.1 (localhost) olarak ayarlanır ve bir ters proxy (Nginx veya Apache gibi) arkasına yerleştirilir. username ve password ise arayüze erişim için kimlik doğrulama bilgileridir. Yapılandırmayı güncelledikten sonra, tarayıcınızdan http://sunucu_ip_adresi:9001 adresine giderek web arayüzüne erişebilirsiniz. Burada tüm programlarınızın durumunu görebilir, onları başlatıp durdurabilir ve loglarına erişebilirsiniz.
Log Yönetimi ve Süreç Öncelikleri
Loglar, sorun giderme ve sistem sağlığını izleme açısından kritik öneme sahiptir. Supervisor, her program için ayrı ayrı stdout_logfile ve stderr_logfile tanımlamanıza olanak tanır. Bu log dosyalarının düzenli olarak döndürülmesi (rotate edilmesi) ve temizlenmesi, disk alanının dolmasını önlemek için önemlidir. logrotate gibi sistem araçlarını kullanarak bu log dosyalarını otomatik olarak yönetebilirsiniz. Ayrıca, [program:] bölümündeki priority parametresi, programların başlatılma ve durdurulma sırasını belirler. Daha düşük öncelikli programlar önce başlatılır ve sonra durdurulur. Bu, bağımlılıkları olan programlar için önemlidir; örneğin, veritabanı bağlantısı gerektiren bir uygulamanın, veritabanı servisi başlamadan başlamamasını sağlayabilirsiniz.
Bu ileri düzey yapılandırma ve izleme teknikleri, Supervisor’ı sadece bir süreç yöneticisinden öte, karmaşık sistemlerin güvenilirliğini ve yönetilebilirliğini artıran kapsamlı bir araç haline getirir. Doğru yapılandırma ile uygulamalarınızın kesintisiz çalıştığından emin olabilir ve olası sorunlara karşı proaktif çözümler geliştirebilirsiniz.
Gerçek Dünya Uygulamaları ve Vaka Analizleri: Supervisor’ın Gücü
Supervisor’ın teorik faydalarını anlamak bir yana, onu gerçek dünya senaryolarında nasıl uygulayabileceğimizi görmek, aracın değerini tam olarak kavramamızı sağlar. Çeşitli sektörlerdeki ve teknoloji yığınlarındaki birçok uygulama, süreçlerini yönetmek için Supervisor’a güvenir. İşte Supervisor’ın yaygın olarak kullanıldığı bazı pratik senaryolar ve örnek yapılandırmalar:
1. Web Uygulamaları için Gunicorn/uWSGI ve Nginx Yönetimi
Modern Python (Django, Flask) veya Ruby (Rails) web uygulamaları genellikle bir WSGI (Web Server Gateway Interface) sunucusu (Gunicorn, uWSGI) ile birlikte çalışır ve Nginx gibi bir ters proxy sunucusu tarafından önbelleklenir. Supervisor, bu bileşenlerin her birini bağımsız süreçler olarak yönetmek için idealdir. Örneğin, bir Django uygulamasını Gunicorn ile çalıştırmak için aşağıdaki gibi bir yapılandırma kullanabilirsiniz:
; /etc/supervisor/conf.d/django_app.conf
[program:gunicorn_app]
command=/path/to/your/venv/bin/gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
directory=/path/to/your/django_project
user=www-data
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/supervisor/gunicorn_app.log
stderr_logfile=/var/log/supervisor/gunicorn_app.err.log
environment=PATH="/path/to/your/venv/bin",DJANGO_SETTINGS_MODULE="myproject.settings.production"
[program:nginx]
command=/usr/sbin/nginx -g "daemon off;"
autostart=true
autorestart=true
user=root ; Nginx genellikle root olarak başlar ve worker süreçlerini ayrıcalıksız kullanıcılara bırakır.
redirect_stderr=true
stdout_logfile=/var/log/supervisor/nginx.log
stderr_logfile=/var/log/supervisor/nginx.err.log
Bu yapılandırmada, Gunicorn süreci sanal ortamınızda başlar ve Django uygulamanızı sunar. Nginx ise ayrı bir Supervisor süreci olarak çalışır ve Gunicorn’a gelen istekleri yönlendirir. Her iki sürecin de autostart ve autorestart özellikleriyle kesintisiz çalışması sağlanır. Nginx’in -g "daemon off;" komutu, Nginx’i arka planda daemon olarak değil, ön planda çalışacak şekilde başlatır, böylece Supervisor onu doğru şekilde izleyebilir.
2. Arka Plan Kuyruk İşleyicileri (Celery, RabbitMQ)
Asenkron görevleri işlemek için kullanılan kuyruk sistemleri (örneğin Python için Celery, Node.js için BullMQ veya Redis Queue), uygulamaların yanıt verme süresini iyileştirmek ve yoğun işlemleri arka plana taşımak için vazgeçilmezdir. Supervisor, bu kuyruk işleyicilerini yönetmek için mükemmel bir araçtır, özellikle birden fazla worker sürecini paralel çalıştırmak gerektiğinde.
; /etc/supervisor/conf.d/celery_workers.conf
[program:celery_worker_1]
command=/path/to/your/venv/bin/celery -A myproject worker -l info --concurrency=4 -n worker1@%h
directory=/path/to/your/django_project
user=www-data
autostart=true
autorestart=true
numprocs=1 ; Tek bir worker süreci için
process_name=%(program_name)s
stdout_logfile=/var/log/supervisor/celery_worker1.log
stderr_logfile=/var/log/supervisor/celery_worker1.err.log
environment=PATH="/path/to/your/venv/bin",DJANGO_SETTINGS_MODULE="myproject.settings.production"
[program:celery_beat]
command=/path/to/your/venv/bin/celery -A myproject beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
directory=/path/to/your/django_project
user=www-data
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/celery_beat.log
stderr_logfile=/var/log/supervisor/celery_beat.err.log
environment=PATH="/path/to/your/venv/bin",DJANGO_SETTINGS_MODULE="myproject.settings.production"
Bu örnekte, Celery worker’ı ve Celery Beat zamanlayıcısı ayrı Supervisor programları olarak tanımlanmıştır. numprocs ile birden fazla worker örneği çalıştırabilir, process_name ile her birine benzersiz isimler verebilirsiniz. Bu, her bir worker’ın izlenmesini ve loglarının ayrıştırılmasını kolaylaştırır. Herhangi bir worker’ın çökmesi durumunda Supervisor onu otomatik olarak yeniden başlatır, böylece kuyruk işleme kesintiye uğramaz.
3. Özel Arka Plan Scriptleri ve Görevleri
Sadece web uygulamaları veya kuyruk işleyicileri değil, aynı zamanda uzun süreli veri senkronizasyon scriptleri, anlık bildirim dinleyicileri veya özel veri işleme görevleri gibi herhangi bir arka plan scripti de Supervisor ile yönetilebilir. Bu, özellikle cron‘un belirli zaman aralıklarıyla çalıştığı senaryoların aksine, sürekli çalışması gereken görevler için faydalıdır.
; /etc/supervisor/conf.d/data_sync.conf
[program:data_synchronizer]
command=/usr/bin/python3 /path/to/your/scripts/sync_data.py
directory=/path/to/your/scripts
user=app_user
autostart=true
autorestart=true
startretries=5
stdout_logfile=/var/log/supervisor/data_sync.log
stderr_logfile=/var/log/supervisor/data_sync.err.log
Bu örnek, belirli bir Python scriptini sürekli olarak çalıştırır. Eğer script beklenmedik bir şekilde durursa, Supervisor onu beş kez yeniden başlatmaya çalışır. Bu tür scriptler için logların ayrıntılı bir şekilde tutulması, olası veri tutarsızlıklarını veya hataları izlemek için kritik öneme sahiptir. Supervisor, bu tür özel görevlerin güvenilirliğini sağlayarak, manuel müdahale ihtiyacını ortadan kaldırır ve sistem genelinde istikrarlı bir çalışma ortamı sunar.
Bu vaka analizleri, Supervisor’ın çeşitli senaryolarda nasıl kullanılabileceğini ve süreç yönetimini nasıl basitleştirdiğini açıkça göstermektedir. İster küçük bir proje ister büyük ölçekli bir kurumsal uygulama olsun, Supervisor süreçlerinizi güvenilir bir şekilde yönetmek için güçlü ve esnek bir çözümdür.
Sonuç ve Gelecek Adımlar: Süreç Yönetiminde Ustalık
Bu makale boyunca, Supervisor’ın ne olduğunu, neden modern sistemlerde vazgeçilmez bir araç haline geldiğini, nasıl kurulacağını ve süreçlerinizi nasıl etkili bir şekilde yöneteceğinizi adım adım öğrendiniz. Temel kurulumdan ileri düzey yapılandırma seçeneklerine ve gerçek dünya senaryolarına kadar geniş bir yelpazeyi kapsadık. Supervisor sayesinde, arka plan süreçlerinizin güvenilirliğini artırabilir, olası kesintileri en aza indirebilir ve sistemlerinizin genel kararlılığını sağlamlaştırabilirsiniz. Artık web uygulamalarınızın, kuyruk işleyicilerinizin veya özel arka plan görevlerinizin her zaman ayakta olduğundan emin olabilirsiniz.
Süreç yönetiminde ustalaşmak, sadece araçları bilmekle kalmaz, aynı zamanda bu araçları kendi özel ihtiyaçlarınıza göre uyarlayabilmekle de ilgilidir. Supervisor, sunduğu esneklik ve zengin özellik seti ile bu adaptasyonu kolaylaştırır. Unutmayın ki, her uygulamanın kendine özgü gereksinimleri vardır ve Supervisor yapılandırmanızı buna göre ayarlamak, en iyi performansı ve güvenilirliği elde etmenizi sağlayacaktır. Logları düzenli olarak kontrol etmek, süreçlerinizi doğru kullanıcılar altında çalıştırmak ve hata durumlarında otomatik bildirimler ayarlamak gibi en iyi uygulamaları benimsemek, sistemlerinizin sorunsuz çalışmaya devam etmesi için kritik öneme sahiptir. Supervisor ile süreç yönetiminde yeni bir seviyeye ulaştığınıza inanıyoruz ve bu bilgileri projelerinizde başarıyla uygulamanızı diliyoruz.
Sıkça Sorulan Sorular (SSS)
-
Supervisor neden
systemdveyainit.dyerine tercih edilmeli?Supervisor, özellikle birden fazla Python uygulaması veya özel script gibi çok sayıda uygulamanın bir arada çalıştığı durumlarda daha esnek ve kullanıcı dostu bir yönetim arayüzü sunar.
systemdsistem servisleri için genel bir çözümdür, ancak Supervisor uygulama süreçlerini uygulama düzeyinde daha detaylı yönetme, otomatik yeniden başlatma, loglama ve gruplama gibi özel yeteneklere sahiptir. Ayrıca, daha az karmaşık yapılandırma ile hızlı bir şekilde devreye alınabilir. -
Supervisor bir sürecin çöktüğünü nasıl anlar ve yeniden başlatır?
Supervisor, yönettiği her bir sürecin PID’ini (Process ID) izler. Eğer bir süreç beklenmedik bir şekilde sonlanırsa (yani beklenen çıkış koduyla değilse veya Supervisor’ın kontrolü dışında kapanırsa), Supervisor bunu algılar. Yapılandırmanızdaki
autorestart=trueveyaautorestart=unexpectedparametreleri sayesinde, Supervisor süreci otomatik olarak yeniden başlatır ve bu işlemistartretriesparametresiyle belirlenen deneme sayısı kadar tekrarlar. -
Bir programın loglarını nasıl izleyebilirim?
Her program tanımında
stdout_logfilevestderr_logfileparametreleriyle log dosyalarının yollarını belirtirsiniz. Bu dosyalara doğrudantail -f /var/log/supervisor/my_app.loggibi komutlarla erişebileceğiniz gibi,sudo supervisorctl tail -f my_appkomutunu kullanarak da logları gerçek zamanlı olarak izleyebilirsiniz. Web arayüzü etkinse, programın detay sayfasından da loglara ulaşabilirsiniz. -
Supervisor yapılandırmasında yaptığım değişiklikleri nasıl uygularım?
Yapılandırma dosyalarında (genellikle
/etc/supervisor/conf.d/altındaki.confdosyaları) değişiklik yaptıktan sonra, Supervisor’a bu değişiklikleri okumasını ve uygulamasını söylemeniz gerekir. Bunu yapmak için sırasıylasudo supervisorctl rereadve ardındansudo supervisorctl updatekomutlarını kullanmalısınız.rereadyeni yapılandırmaları algılar,updateise bu değişiklikleri mevcut süreçlere uygular (yeni süreçleri başlatır, kaldırılanları durdurur). -
Supervisor’ı farklı kullanıcılar altında çalıştırmak güvenli midir?
Evet, kesinlikle güvenlidir ve hatta güvenlik açısından şiddetle tavsiye edilir. Her
[program:]bloğundauser=kullanıcı_adıparametresini kullanarak, o programın belirli bir ayrıcalıksız kullanıcı altında çalışmasını sağlayabilirsiniz. Bu, bir uygulamanın güvenlik açığı nedeniyle tehlikeye girmesi durumunda, saldırganın sistem üzerinde elde edebileceği yetkileri sınırlar. Supervisor’ın kendisi genellikle root ayrıcalıklarıyla başlar, ancak yönettiği süreçleri belirlenen ayrıcalıksız kullanıcılar altında çalıştırır.
