Giriş
systemd modern Linux dağıtımlarının init sistemidir ve PID 1 olarak çalışır. Servis yönetimi, bağımlılık çözümü, log toplama ve zamanlayıcıları tek çatı altında birleştirir.
SysV init script'lerinin yerini .service unit dosyaları almıştır. systemctl komutu servisleri başlatır, durdurur, etkinleştirir ve durum sorgular.
Bu rehberde unit dosyası anatomisi, [Install] bölümü, override mekanizması ve üretim best practice'lerini inceliyoruz.
Unit Dosyası Yapısı
[Unit] bölümü Description, After, Before, Requires, Wants tanımlar. [Service] ExecStart, Restart, User, Type içerir. [Install] WantedBy boot hedefini belirler.
Unit dosyaları /etc/systemd/system/ (admin) ve /usr/lib/systemd/system/ (paket) altında bulunur. systemctl edit ile drop-in override oluşturulur.
[Unit]
Description=My Application
After=network.target postgresql.service
[Service]
Type=simple
User=deploy
ExecStart=/opt/app/bin/start.sh
Restart=on-failure
[Install]
WantedBy=multi-user.targetServis Yönetimi Komutları
systemctl start/stop/restart/reload servis adını yönetir. enable/disable boot'ta otomatik başlatmayı kontrol eder. status detaylı durum ve son log satırlarını gösterir.
daemon-reload unit dosyası değişikliğinden sonra zorunludur. list-units --type=service tüm servisleri listeler.
- start: başlat
- enable: boot'ta aç
- reload: yapılandırma yenile
- is-active: durum kontrol
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
sudo systemctl status myapp.service
journalctl -u myapp.service -fBağımlılıklar ve Sıralama
After=postgresql.service postgresql başladıktan sonra bu servisi başlatır; Requires= başarısızlıkta bu servisi de durdurur. Wants= zayıf bağımlılıktır.
multi-user.target normal sunucu boot hedefidir. graphical.target masaüstü ortamı içerir.
[Unit]
Requires=network-online.target
After=network-online.target docker.service
Wants=redis.servicejournalctl ile Log İzleme
systemd journal merkezi log deposudur. journalctl -u servis.service servis loglarını filtreler. -f canlı takip, --since '1 hour ago' zaman filtresi sağlar.
PersistentStorage=yes /etc/systemd/journald.conf ile reboot sonrası log saklanır.
journalctl -u nginx.service --since today
journalctl -p err -b
journalctl -u myapp -o json-prettyTimer ve Socket Unit'leri
.timer unit cron alternatifidir; OnCalendar veya OnUnitActiveSec ile tetiklenir. .socket unit socket activation sağlar; istek gelince servis başlar.
systemctl list-timers --all aktif zamanlayıcıları gösterir.
ExecStart öncesi ortam değişkenleri Environment= veya EnvironmentFile= ile tanımlayın; shell export güvenilir değildir.
Üretim Best Practice
Restart=on-failure veya always ile otomatik kurtarma. LimitNOFILE dosya tanımlayıcı limiti. Security hardening: NoNewPrivileges, PrivateTmp.
Servisleri root yerine dedicated user ile çalıştırın. ExecStartPre migration veya hazırlık adımları için kullanılır.
- Dedicated kullanıcı
- Restart politikası
- journalctl izleme
- daemon-reload unutmayın
- Override ile minimal değişiklik
Sonuç
systemd servis yönetimini öğrenmek modern Linux operasyonunun temelidir. Unit dosyalarını versiyon kontrolünde tutun ve infrastructure-as-code ile dağıtın.
journalctl ile logları merkezi izleyin; timer ile cron görevlerini modernleştirin.