Systemd, linuxta system ve service yönetimi yapmakatadir. Aynı zamada bazı işletim sistemlerinde SysV ve LSB ile de beraber çalışabilmektedir.
Systemd daemon olarak PID 1 de çalışmaktadır.
Systemd’de bütün görevler units olarak organize edilmektedir. Birçok farklı unitler bulunmaktadır. Bunlar:
- services(.service)
- mount points(.mount)
- devices(.device)
- sockets(.socket)
- timer(.timer)
Örnek olarak bir secure shell daemon başlatıldığında unit ssh.service kullanılmaktadır.
[Unit] Dosyası Elementleri
Bir Unit dosyası çoğunlukla Unit ile başlamaktadır.
- Description: İnsanların okuması için eklenen kısa unit başlık bölümüdür. Bu alan belki systemd tarafından UI olarak gösterilmekte kullanılabilmektedir.
- Documentation: Space-separated olacak şekilde URI’lerin eklendiği bölümdür. Bu URI’ler ilgili unit dosyasının bilgilerini içermektedir.
- Requires: Want’a benzemekte ancak daha güçlü bir gereksinim bağlılığı bildirir.
- Before, After: Bu ikisi space-spareted olacak şekilde, çalıştırılacak olan unitlerin sıralamasını yapmaktadır. Örnek olarak çalıştırılacak bir unit içerisinde before olarak test.service var ise; öncelikle test.service çalıştırılır sonrasında ilgili unite geçilir.
- User: Unit’in hangi user olarak çalıştırılacağını belirtir.
- ExecStart: Çalıştırılacak olan komutun konumunu belirtir.
- OnFailure: Hata durumunda çalıştırılacak unitler listesi.
Örnek bir unir dosyası aşağıdaki şekildedir:
[Unit]
Description=Service description
Documentation=https://aliyilmaz.co
After=network.target
Wants=network-online.target
Requires=postgresql.service
[Service]
User=aly
Group=aly
WorkingDirectory=/home/code
ExecStart=/home/code/run.sh
ExecStop=/bin/kill -s QUIT $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=30
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
EnvironmentFile=/home/code/.env
KillMode=process
Type=simple
[Install]
WantedBy=multi-user.target
# touch **/etc/systemd/system/*<name>*.service**
ile unit dosyasını oluşturduktan sonra içerisine unit ayarları eklenmelidir.
Daha sonrasında sırasıyla kodları çalıştırmak yeterli olacaktır.
systemctl daemon-reload # systemd yapılandırmalarını yeniler
systemctl enable name.service # sistem başlangıcında oto açılması için ekler
systemctl start <name>.service # service hemen başlatılır
systemctl status name.service # servicenin güncel status durumunu gösterir
journalctl -u name.service # ilgili service için log kayıtlarını gösterir
Çalıştırılacak kodun bir python kodu olduğunu düşünürsek oluşturmamız gereken run.sh dosyası aşağı yukarı bu şekilde olması gerekmektedir (venv önceden kurulduğu senaryoda geçerlidir).
#!/bin/bash
set -e
echo "$(date '+%Y-%m-%d %H:%M:%S') - Başlatılıyor..." >> /home/code/logs/service.log
cd /home/code
source /home/code/virtual/bin/activate
python3 -u /home/code/app.py "$@"
exit_code=$?
echo "$(date '+%Y-%m-%d %H:%M:%S') - Program sonlandı, çıkış kodu: $exit_code" >> /home/code/logs/service.log
exit $exit_code