systemd ile kendi servisinizi yazmak: screen ve nohup'a veda
Arka planda çalışması gereken bir betik ya da uygulama için screen oturumu açmak işe yarar, ta ki sunucu yeniden başlayana kadar. Otomatik başlayan, çökünce kalkan ve logları tutulan bir systemd servisini adım adım yazıyoruz.
"Uygulamayı nohup ile başlattım, sunucu yeniden başlayınca kapanmış" cümlesini çok duydum. Linux'ta bu işin doğru aracı zaten kurulu geliyor: systemd.
En basit servis dosyası
/etc/systemd/system/uygulama.service:
[Unit]
Description=Benim uygulamam
After=network-online.target
Wants=network-online.target
[Service]
User=uygulama
WorkingDirectory=/srv/uygulama
EnvironmentFile=/srv/uygulama/.env
ExecStart=/usr/bin/node server.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
- User: Servisi root ile çalıştırmayın; ona özel bir kullanıcı açın.
- Restart=on-failure: Uygulama çökerse 5 saniye sonra yeniden başlatılır.
- EnvironmentFile: Gizli değerler servis dosyasında değil, izinleri kısıtlı ayrı bir dosyada durur.
Çalıştırmak
sudo systemctl daemon-reload
sudo systemctl enable --now uygulama
systemctl status uygulama
enable --now hem şimdi başlatır hem de açılışta otomatik başlamasını sağlar.
Loglar
Uygulamanın standart çıktısına yazdığı her şey journal'a gider; ayrıca log dosyası yönetmenize gerek kalmaz:
journalctl -u uygulama -f
journalctl -u uygulama --since "1 hour ago"
Bonus: Birkaç satırla sertleştirme
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/srv/uygulama/storage
Bu satırlar servisin sistem dosyalarına yazmasını ve yetki yükseltmesini engeller. Uygulama ele geçirilse bile zarar sınırlı kalır. Mevcut durumu puanlamak için:
systemd-analyze security uygulama
Sonuç
Yirmi satırlık bir dosya; karşılığında otomatik başlama, çökme sonrası kurtarma, merkezi loglar ve ek bir güvenlik katmanı. Sunucuda uzun süre çalışacak her şey için ilk tercihim bu.