Linux Services, sistemin kritik işlevlerini yerine getiren arka plan süreçleridir. systemd kullanılarak bu servisler kolayca yönetilebilir. Servislerin başlatılması, durdurulması, yeniden başlatılması ve sistem başlatıldığında otomatik olarak çalışacak şekilde ayarlanması gibi işlemler yapılabilir.
# HTTPD hizmetini başlatmak için kullanılır. Bu iki komut aynı işi yapar, # ancak systemctl daha modern ve tercih edilen yöntemdir.servicehttpdstartsystemctlstarthttpd# HTTPD hizmetini durdurmak için kullanılır.systemctlstophttpd# HTTPD hizmetinin durumunu kontrol etmek için kullanılır. # Hizmetin çalışıp çalışmadığını ve varsa hata mesajlarını gösterir.systemctlstatushttpd# HTTPD hizmetini sistem başlatıldığında otomatik olarak çalışacak şekilde ayarlamak için kullanılır.systemctlenablehttpd# HTTPD hizmetini sistem başlatıldığında otomatik olarak çalışmayacak şekilde ayarlamak için kullanılır.systemctldisablehttpd
Linux sistemlerinde servisler, eskiden init scripts adı verilen scriptler ile yönetilirdi. Bu scriptler, her servisi başlatmak, durdurmak ve durumunu kontrol etmek için kullanılırdı. Init scripts basit ve shell script olarak yazılırdı, bu da yönetimi kolaylaştırırdı. Ancak, bu yöntem servisleri sıralı olarak başlattığı için sistemin açılış süresi uzar ve servisler arası bağımlılıkları ve hataları yönetmek zor olurdu.
Öte yandan, systemd modern Linux dağıtımları için tasarlanmış bir servis yöneticisidir. Servisleri bağımlılıklarına göre paralel olarak başlatabilir, bu da sistemin daha hızlı açılmasını sağlar. Ayrıca, systemd bağımlılıkları daha iyi yönetir ve Servislerin daha kararlı çalışmasını sağlar. Yapılandırma dosyaları INI formatındadır. Systemd sadece hizmet yönetimiyle kalmaz, aynı zamanda log yönetimi, cihaz yönetimi gibi birçok ek işlev sunar.
Sonuç olarak, init scripts basit ve geleneksel bir yöntemken, systemd modern sistemler için daha uygun, hızlı çözümdür. Bu yüzden çoğu modern Linux dağıtımı systemd'yi kullanmaktadır.
Python Flask uygulamamızı systemd servisi haline getirelim;
Örneğin, app.py adında basit bir Flask uygulamanız olduğunu varsayalım.
/etc/systemd/system/ dizininde yeni bir servis dosyası oluşturun. Örneğin, flaskapp.service adında bir dosya oluşturacağız.
sudovi/etc/systemd/system/flaskapp.service
Aşağıdaki örnek içeriği servis dosyasına yapıştırın. Bu içerik, Flask uygulamanızı doğrudan Python kullanarak systemd hizmeti olarak çalıştıracaktır.
flaskapp.service
[Unit]Description=A simple Flask web applicationAfter=network.target[Service]User=your_userWorkingDirectory=/path/to/your/appExecStart=/usr/bin/python3 /path/to/your/app/app.py[Install]WantedBy=multi-user.target
User=your_user: Buraya servisi çalıştıracak kullanıcının adını yazın.
WorkingDirectory=/path/to/your/app: Buraya Flask uygulamanızın bulunduğu dizinin yolunu yazın.
ExecStart=/usr/bin/python3 /path/to/your/app/app.py: Bu komut, Flask uygulamanızı Python kullanarak çalıştırır.
"your_user", Flask uygulamanızı çalıştırmak için kullanılacak kullanıcı adıdır. Bu, sisteminizde mevcut olan bir kullanıcı adı olmalıdır. Genellikle, bu kullanıcı uygulamanın çalıştırıldığı dizin ve dosyalara erişim iznine sahip bir kullanıcı olur.
Servisi etkinleştirin ve başlatın.
# systemd'yi yeniden yükleyinsudosystemctldaemon-reload# Servisi etkinleştirinsudosystemctlenableflaskapp# Servisi başlatınsudosystemctlstartflaskapp# Servisin durumunu kontrol edinsudosystemctlstatusflaskapp
Bu adımları izleyerek, Python Flask uygulamanızı systemd servisi olarak çalıştırabilirsiniz. Bu yöntemle Flask uygulamanız doğrudan sistem genelinde kurulu Python ile başlatılır ve systemd tarafından yönetilir.
Sample Systemd File,
# /lib/systemd/system/docker.service[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comBindsTo=containerd.serviceAfter=network-online.target firewalld.service containerd.serviceWants=network-online.targetRequires=docker.socket# Unit sekmesi, servisin ne olduğunu, hangi servislere bağlı olduğunu ve hangi servislerden sonra başlatılması gerektiğini belirtir.
# Description: Hizmetin kısa açıklaması.# Documentation: Hizmetle ilgili dökümantasyonun bulunduğu URL.# BindsTo: Bu servis containerd.service ile bağlantılıdır. containerd.service durduğunda bu servis de durur.# After: Bu servis, network-online.target, firewalld.service ve containerd.service servislerinden sonra başlatılmalıdır.
# Wants: Bu servis network-online.target servisini de başlatmak ister.# Requires: Bu servis, docker.socket servisine ihtiyaç duyar. Bu servis olmadan çalışmaz.[Service]Type=notifyExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockExecReload=/bin/kill -s HUP $MAINPIDRestart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinity# Service sekmesi, servisin nasıl başlatılacağını, durdurulacağını ve yeniden yükleneceğini belirtir.# Type: Servisin başlatılma tipini belirtir. "notify" servisin systemd'ye başlatılma durumunu bildireceği anlamına gelir.
# ExecStart: Servisin başlatılacağı komut. Burada Docker daemon (dockerd) başlatılıyor.# ExecReload: Servisin yeniden yüklenmesi için kullanılacak komut. Burada ana süreç (MAINPID) yeniden başlatılıyor.# Restart: Servisin her zaman yeniden başlatılmasını sağlar.# StartLimitBurst: Belirli bir zaman aralığında kaç kez yeniden başlatılabileceğini belirtir.# StartLimitInterval: Yeniden başlatma sınırının zaman aralığı.# LimitNOFILE: Bu servis için açık dosya sayısı sınırı.# LimitNPROC: Bu servis için işlem sayısı sınırı.# LimitCORE: Bu servis için core dump dosyası sınırı.[Install]WantedBy=multi-user.target# Install sekmesi, servisin hangi hedeflerle (target) birlikte başlatılacağını belirtir.# WantedBy: Bu servis, multi-user.target ile birlikte başlatılacak. multi-user.target, sistemin çok kullanıcı modunda çalıştığı anlamına gelir.