WordPress, yazılım ve IT üzerine notlar
Anasayfa » Sunucu & Linux » Kendi uygulamanız için systemd servisi yazmak: nohup ve screen'e veda

Kendi uygulamanız için systemd servisi yazmak: nohup ve screen'e veda

İçindekiler
  1. İlk servis dosyası
  2. Etkinleştirmek ve başlatmak
  3. Günlükler: journalctl
  4. Sık karşılaşılan sorunlar
  5. Biraz daha güvenlik
  6. Zamanlanmış görevler için timer
  7. Sonuç

Sunucuda bir Node.js uygulaması, bir Python betiği ya da küçük bir Go servisi çalıştırmanız gerekti. İlk akla gelen yöntem genelde şudur:

nohup python3 bot.py > bot.log 2>&1 &

Bu yöntem çalışır, ta ki sunucu yeniden başlayana ya da uygulama bir hata yüzünden çökene kadar. O zaman kimse uygulamayı tekrar başlatmaz, siz de durumu ancak bir kullanıcı şikâyet ettiğinde öğrenirsiniz.

Modern Linux dağıtımlarının neredeyse tamamında bulunan systemd, bu işi sizin yerinize yapar.

İlk servis dosyası

/etc/systemd/system/bot.service:

[Unit]
Description=Telegram bildirim botu
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=botuser
Group=botuser
WorkingDirectory=/opt/bot
ExecStart=/opt/bot/venv/bin/python /opt/bot/bot.py
Restart=on-failure
RestartSec=5
EnvironmentFile=/opt/bot/.env

[Install]
WantedBy=multi-user.target

Bölümleri kısaca açıklayayım:

  • After=network-online.target: Ağ hazır olmadan başlama.
  • User= / Group=: Uygulamayı root olarak değil, ayrıcalıksız bir kullanıcıyla çalıştır. Bu çok önemli: Uygulamadaki bir açık bütün sunucuyu ele geçirmesin.
  • ExecStart=: Çalışacak komut. Tam yol yazın; systemd sizin shell ortamınızı ve PATH değişkeninizi bilmez.
  • Restart=on-failure: Uygulama hata koduyla çıkarsa 5 saniye sonra yeniden başlat.
  • EnvironmentFile=: Şifre ve ayarları bir dosyadan ortam değişkeni olarak yükle.
  • WantedBy=multi-user.target: "Etkinleştir" dediğimde açılışta başlat.

Etkinleştirmek ve başlatmak

systemctl daemon-reload
systemctl enable --now bot
systemctl status bot

daemon-reload, systemd'nin yeni ya da değişmiş birim dosyalarını okumasını sağlar. Servis dosyasını her değiştirdiğinizde bu komutu çalıştırmanız gerekir. enable --now ise hem açılışta başlatmayı ayarlar hem de servisi hemen çalıştırır.

Günlükler: journalctl

nohup ile bir log dosyası tutmanıza gerek kalmaz. Uygulamanın standart çıktısına ve hata çıktısına yazdığı her şey systemd günlüğüne gider:

journalctl -u bot -f              # canlı izle
journalctl -u bot --since "1 hour ago"
journalctl -u bot -p err          # yalnızca hatalar

Günlükler zamanla dolmaz; journald boyut sınırına göre eskileri kendisi siler.

Sık karşılaşılan sorunlar

Servis başlıyor ve hemen duruyor. systemctl status bot ve journalctl -u bot -n 50 çıktısına bakın. Çoğu zaman sebep şunlardan biridir: yanlış yol, eksik izin ya da sizin shell'inizde tanımlı ama servise verilmemiş bir ortam değişkeni.

"Start request repeated too quickly". Uygulama sürekli çöküyor ve systemd belirli bir süre içinde çok fazla yeniden başlatma denediği için vazgeçti. Önce çökmenin sebebini çözün, sonra şu komutla sayacı sıfırlayın:

systemctl reset-failed bot

Uygulama çalışıyor ama dosyaya yazamıyor. User= ile belirttiğiniz kullanıcının o klasöre yazma izni yoktur. chown ile sahipliği düzeltin.

Biraz daha güvenlik

systemd, uygulamanızı birkaç satırla kum havuzuna (sandbox) almanıza da izin verir:

[Service]
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/bot/data
PrivateTmp=true

Bu ayarlarla uygulama, sistem dosyalarını yalnızca okuyabilir. Ev dizinlerini göremez ve yalnızca izin verdiğiniz klasöre yazabilir. Hangi ayarların uygulamanızı ne kadar koruduğunu görmek için:

systemd-analyze security bot

Zamanlanmış görevler için timer

systemd, cron'un yerine de kullanılabilir. Bir .timer dosyası bir .service dosyasını belirli aralıklarla çalıştırır. Cron'a göre avantajı, çıktının otomatik olarak günlüğe gitmesi ve sunucu kapalıyken kaçırılan çalışmaları açılışta telafi edebilmesidir (Persistent=true).

Sonuç

Bir servis dosyası yazmak on dakika sürer. Karşılığında uygulamanız açılışta kendiliğinden başlar, çökerse kendini toparlar, günlükleri tek bir yerde durur ve root yetkisi olmadan çalışır. nohup ile kıyaslanmayacak kadar sağlam bir düzen.

Tezcan Kabakçı
Hosting teknik destek uzmanı ve WordPress uzmanı. 2024'ten beri bir hosting şirketinde teknik destek bölümünde çalışıyor; WordPress, DNS ve e-posta sorunlarını her gün yakından görüyor. YouTube kanalı.
Bu yazı 28 Ağustos 2026 tarihinde Sunucu & Linux kategorisinde yayınlandı.
Yeni yazılar e-postanıza gelsin

Ayda birkaç e-posta; istediğiniz an tek tıkla ayrılabilirsiniz.

Videolu anlatımlar YouTube'da
Sunucu ve WordPress sorunlarını kısa videolarla anlattığım kanala abone olabilirsiniz. ▶ Kanala abone ol

Yorumlar

Henüz yorum yok. İlk yorumu siz yazın.

Yorum yazın

Yorumlar onaylandıktan sonra yayımlanır. Bağlantı içeren yorumlar spam olarak değerlendirilebilir.