service Komutu ile Linux Servis Yonetimi
Linux sistem yoneticilerinin en cok kullandigi komutlardan biri olan service, gunluk operasyonlarda vazgecilmez bir araca donusuyor. Ister bir web sunucusunu yeniden baslatmak, ister bir servisin durumunu kontrol etmek olsun, bu komut isimizi bir hayli kolaylastiriyor. Bu yazida service komutunu tum yonleriyle ele alacagiz ve gercek dunya senaryolariyla pekistirip sisteminizi daha etkin yonetmenize yardimci olacagiz.
service Komutu Nedir?
service komutu, Linux sistemlerde servisleri (daemon’lari) yonetmek icin kullanilan bir sarmalayici (wrapper) betiktir. Temelde /etc/init.d/ dizinindeki init scriptlerini calistirir. Ancak modern sistemlerde systemd’ye gecisle birlikte bu komut, arka planda systemctl‘e yonlendirme yapacak sekilde guncellenmistir.
Peki neden hala service komutu kullaniyoruz? Cunku:
- Eski aliskanliklarin guclu olmasi: Yillarca
service apache2 restartyazarak gelismis birinesystemctl restart apache2yazdirmak zor. - Tasinabilirlik: Hem SysVinit hem de systemd sistemlerde calisan scriptler yazarken
servicedaha evrensel kalir. - Okunaklilik: Komut yapisi son derece sade ve anlasilirdir.
Temel Sozdizimi
service <servis_adi> <komut>
Temel komutlar sunlardir:
start– Servisi baslatirstop– Servisi durdururrestart– Servisi yeniden baslatirreload– Yapilandirma dosyalarini yeniden yukler (servisi kesmeden)status– Servisin mevcut durumunu gosterircondrestart– Yalnizca servis zaten calisiyorsa yeniden baslatirforce-reload– Yapilandirmayi zorla yeniden yukler
Pratik Kullanim Ornekleri
1. Servis Durumunu Kontrol Etmek
En sik yapilan islem servisin calisip calismadigini kontrol etmektir. Ozellikle bir sorun bildirildiginde ilk yapilmasi gereken budur.
# Apache web sunucusunun durumunu kontrol et
service apache2 status
# MySQL veritabani sunucusunun durumunu kontrol et
service mysql status
# SSH daemon durumunu kontrol et
service ssh status
# Tum servislerin durumunu listele (SysVinit sistemlerde)
service --status-all
service --status-all komutu sizi gercekten sasirtabilir. Sistemde ne kadar cok servisin arka planda kostu veya durdu oldugunu gordugunuzde, “bunlarin hepsine ihtiyacim var mi?” diye sorgulamaya baslayabilirsiniz. Bu sorgu, gereksiz servisleri kapatarak sistem kaynaklarini geri kazanmak icin guzel bir baslangic noktasidir.
2. Servis Baslatma ve Durdurma
# Nginx servisini baslat
sudo service nginx start
# Nginx servisini durdur
sudo service nginx stop
# Nginx servisini yeniden baslat (kesinti yaratir)
sudo service nginx restart
# Nginx yapilandirmasini test edip yeniden yukle (kesintisiz)
sudo service nginx reload
Burada restart ile reload arasindaki fark cok onemlidir. Production ortaminda calisirken bir web sunucusunu restart etmek, o anda baglanan kullanicilar icin kisa bir kesinti yaratabilir. Oysa reload, mevcut baglantilari kesmeden yeni yapilandirmayi devreye alir. Mumkun oldugunda reload tercih edin.
3. Koşullu Yeniden Baslama
# MySQL zaten calisiyorsa yeniden baslat, degilse dokunma
sudo service mysql condrestart
# Postfix posta sunucusu icin ayni islem
sudo service postfix condrestart
Bu ozellik ozellikle cron joblarinda ve otomatik bakiyici scriptlerde cok isine yarar. “Servis calisiyorsa yeniden baslat, yoksa hata verme” mantigini tek satirda sagliyorsunuz.
Gercek Dunya Senaryolari
Senaryo 1: Gece Yarim Acil Cagri – Web Sunucu Cevap Vermiyor
Sabah 2:30’da telefonunuz caliyor. Bir musteri “site cevap vermiyor” diyor. Hemen baglaniyor ve ilk kontrollerinizi yapiyorsunuz:
# Once Apache'nin durumunu kontrol et
sudo service apache2 status
# Cevap alamadinizsa loglara bak
sudo tail -n 50 /var/log/apache2/error.log
# Servisi yeniden baslatmayı dene
sudo service apache2 restart
# Yeniden baslatma basarisiz olduysa force-reload dene
sudo service apache2 force-reload
# Hala cevap vermiyorsa PHP-FPM gibi bagimliliklari kontrol et
sudo service php8.1-fpm status
sudo service php8.1-fpm restart
Cogunlukla bu adimlar yeterli olur. Ama yeniden baslatma basarisiz oluyorsa bu genellikle yapilandirma dosyasinda bir syntax hatasi olduguna isaret eder. apache2ctl configtest veya nginx -t ile yapilandirmayi once test edin.
Senaryo 2: Uygulama Guncelleme Sonrasi Servis Yonetimi
Bir uygulama guncelleme scripti yaziyorsunuz ve guncelleme sirasinda servisleri kontrol altinda tutmaniz gerekiyor:
#!/bin/bash
APP_NAME="myapp"
SERVICE_NAME="gunicorn"
echo "Guncelleme basliyor..."
# Servisin calistigini dogrula
if service $SERVICE_NAME status > /dev/null 2>&1; then
echo "$SERVICE_NAME servisi aktif, durdurulyor..."
sudo service $SERVICE_NAME stop
else
echo "$SERVICE_NAME zaten durmus durumda."
fi
# Uygulama guncellemesini yap
cd /var/www/$APP_NAME
git pull origin main
pip install -r requirements.txt
# Veritabani migrasyonlarini calistir
python manage.py migrate
# Statik dosyalari topla
python manage.py collectstatic --noinput
# Servisi yeniden baslat
echo "Servis yeniden baslatiliyor..."
sudo service $SERVICE_NAME start
# Servisin basarili baslayip baslamadigini kontrol et
sleep 3
if service $SERVICE_NAME status > /dev/null 2>&1; then
echo "Guncelleme basarili! $SERVICE_NAME servisi calisiyor."
else
echo "HATA: $SERVICE_NAME servisi baslamiyor! Loglar kontrol edilmeli."
exit 1
fi
Bu tarz scriptler production ortaminda gunluk operasyonlarin vazgecilmez parcasidir.
Senaryo 3: Coklu Servis Saglik Kontrolu
Bir monitoring scripti hazirlayalim. Kritik servislerin durumunu kontrol edip sorunlari tespit edelim:
#!/bin/bash
# Kontrol edilecek servisler
SERVICES=("nginx" "mysql" "redis-server" "memcached" "postfix")
FAILED_SERVICES=()
echo "=== Servis Saglik Kontrolu ==="
echo "Tarih: $(date)"
echo "----------------------------"
for SERVICE in "${SERVICES[@]}"; do
if service "$SERVICE" status > /dev/null 2>&1; then
echo "[OK] $SERVICE calisiyor"
else
echo "[HATA] $SERVICE DURDU!"
FAILED_SERVICES+=("$SERVICE")
fi
done
echo "----------------------------"
if [ ${#FAILED_SERVICES[@]} -gt 0 ]; then
echo "UYARI: Asagidaki servisler calismıyor:"
for FAILED in "${FAILED_SERVICES[@]}"; do
echo " - $FAILED"
# Otomatik yeniden baslatma dene
echo " Yeniden baslatma deneniyor: $FAILED"
sudo service "$FAILED" start
sleep 2
if service "$FAILED" status > /dev/null 2>&1; then
echo " $FAILED basarıyla yeniden baslatildi!"
else
echo " $FAILED yeniden baslatılamadi! Manuel mudahale gerekiyor."
# Buraya email veya Slack bildirimi eklenebilir
fi
done
else
echo "Tum servisler normal calisıyor."
fi
Bu scripti cron’a koyarsaniz her 5 dakikada bir otomatik kontrol yapabilirsiniz:
# crontab -e ile ekle
*/5 * * * * /opt/scripts/servis_kontrol.sh >> /var/log/servis_kontrol.log 2>&1
service ile systemctl Arasindaki Fark
Modern sistemlerde (Ubuntu 16.04+, CentOS 7+, Debian 8+) service komutu arkadan systemctl‘e yonlendirme yapar. Ama bazi onemli farklar var:
| Islem | service komutu | systemctl komutu | |—|—|—| | Baslatma | service nginx start | systemctl start nginx | | Durdurma | service nginx stop | systemctl stop nginx | | Durum | service nginx status | systemctl status nginx | | Otostartı etkinlestir | (desteklemez direkt) | systemctl enable nginx | | Tum servisler | service --status-all | systemctl list-units |
Kritik not: service komutu servisin sistem acilisinda otomatik baslamasini saglamaz. Bunun icin systemctl enable veya eski sistemlerde update-rc.d / chkconfig kullanmaniz gerekir.
# Servisi hem hemen baslat hem de otostarta al
sudo systemctl enable --now nginx
# Sadece service komutu kullaniyorsaniz ve otostart gerekiyorsa
sudo service nginx start
sudo systemctl enable nginx # otostart icin systemctl kullanmak gerekiyor
Servis Log Takibi
Bir sorunu cozmeye calisirken servis loglarini takip etmek sart. service komutu dogrudan log gostermez, ancak asagidaki kombinasyonla etkili bir hata ayiklama yapabilirsiniz:
# Systemd loglarinda servisi filtrele (gercek zamanli)
journalctl -u nginx -f
# Son 100 satir
journalctl -u mysql -n 100
# Belirli bir zaman araliginda
journalctl -u apache2 --since "2024-01-15 10:00:00" --until "2024-01-15 12:00:00"
# Sadece hatalari goster
journalctl -u postgresql -p err
# Servis yeniden baslatildiktan sonra logları izle
sudo service redis-server restart && journalctl -u redis-server -f
Sikca Yapilan Hatalar ve Cozumleri
“Failed to start” Hatasi
# Yapilandirma hatasini kontrol et
sudo service nginx configtest
# veya
sudo nginx -t
# Sistemd detayli bilgi icin
sudo systemctl status nginx -l
Port Zaten Kullanimda Hatasi
# Hangi proses portu kullaniyor bul
sudo ss -tlnp | grep :80
# veya
sudo lsof -i :80
# Eger eski proses kalmissel oldurebilirsin
sudo kill -9 <PID>
sudo service nginx start
Servis Basliyor ama Hemen Duruyor
Bu durum genellikle yapilandirma dosyasinda bir hata oldugunun isarettir. Ayrintili log kontrolu yapmaniz gerekir:
# Servisi elle baslat ve ciktisini izle
sudo service myapp start
sudo journalctl -u myapp -n 20 --no-pager
Ipuclari ve En Iyi Uygulamalar
- Production’da her zaman reload tercih edin:
restartyerinereloadkullanmak aktif baglantilari korur. - Degisiklik oncesi durum kaydet:
service --status-all > /tmp/servis_durumu_$(date +%F).txtile anlık durumu kaydedin. - Scriptlerinizde cikis kodlarini kontrol edin:
servicekomutu basarisiz olursa sifir olmayan cikis kodu dondurur. Scriptlerinizdeset -ekullanin. - Log rotation unutmayin: Servis loglarinin sonsuz buyumemesi icin
logrotateyapilandirin. - Test ortaminda deneyin: Kritik bir servisi production’da ilk kez yeniden baslatmadan once test ortaminda deneyin.
Sonuc
service komutu, Linux sistem yoneticilerinin arac kutusundaki en temel ve guvenilir araclardan biri olmaya devam ediyor. Sistemd’nin yaygınlasmasiyla birlikte systemctl daha fazon hale gelse de service komutunun sadeligi ve evrensel kullanimi onu hala guncel ve degerli kilıyor.
Gunluk operasyonlarda, acil mudahalelerde veya otomasyona yonelik scriptler yazarken service komutunu etkin kullanmak size ciddi zaman kazandirır. Burada paylastığimiz senaryo ve ornekleri kendi ortaminiza uyarlayarak hem guvenilirlik hem de operasyonel olgunluk kazanabilirsiniz.
En onemli nokta su: Bir servisi yeniden baslatmak sorunu gecici olarak cozebilir, ama kök nedeni bulmak icin loglara bakmak zorundasiniz. service komutunuzu ogrenin, ama loglarinizi da okumayı ihmal etmeyin.