Linux sistemlerde bir şeylerin “arka planda çalışıyor” olması, aslında servis yönetiminin ne kadar kritik olduğunu gösteriyor. Web sunucunuz çöktü mü? Veritabanınız yanıt vermiyor mu? SSH bağlantısı koptu mu? Bunların hepsinin cevabı servis yönetiminden geçiyor. service komutu, özellikle SysVinit tabanlı sistemlerde ve hâlâ pek çok modern dağıtımda bir köprü görevi görerek servis yönetimini kolaylaştırıyor. Bu yazıda service komutunu her yönüyle ele alacağız ve gerçek dünya senaryolarıyla pekiştireceğiz.
service Komutu Nedir ve Neden Kullanılır?
service komutu, Linux sistemlerde çalışan servisleri (daemon’ları) yönetmek için kullanılan bir araçtır. Temel olarak /etc/init.d/ dizinindeki init scriptleri için bir sarmalayıcı (wrapper) görevi görür. Hem SysVinit hem de systemd tabanlı sistemlerde kullanılabilir; systemd sistemlerde arka planda systemctl komutuna yönlendirilir.
Neden service komutunu öğrenmek gerekiyor? Çünkü:
- Eski sistemlerde (CentOS 6, Debian 7 vb.) doğrudan kullanılır
- Systemd sistemlerde de çalışır, geriye dönük uyumluluk sağlar
- Basit ve akılda kalıcı söz dizimine sahiptir
- Birçok otomasyon scriptinde hâlâ kullanılmaktadır
- Sistem kurtarma senaryolarında hayat kurtarır
Temel Söz Dizimi
service <servis_adı> <komut>
Buradaki komut kısmına geçebileceğimiz temel seçenekler şunlardır:
- start: Servisi başlatır
- stop: Servisi durdurur
- restart: Servisi önce durdurup sonra başlatır
- reload: Servisi yeniden başlatmadan yapılandırmasını yeniler
- status: Servisin mevcut durumunu gösterir
- condrestart: Servis çalışıyorsa yeniden başlatır, çalışmıyorsa dokunmaz
- force-reload: reload desteklenmiyorsa restart uygular
Temel Kullanım Örnekleri
En sık kullanılan senaryolarla başlayalım. Bir web sunucusu yönetiyorsunuz ve Apache’yi kontrol etmeniz gerekiyor:
# Apache servisini başlatma
service apache2 start
# Apache servisini durdurma
service apache2 stop
# Apache servisini yeniden başlatma
service apache2 restart
# Apache'nin durumunu kontrol etme
service apache2 status
Bir başka yaygın senaryo: MySQL veritabanını yönetmek.
# MySQL servisini başlatma
service mysql start
# MySQL'i durdurmadan yapılandırmayı yenileme
service mysql reload
# MySQL servisini yeniden başlatma
service mysql restart
SSH servisini yönetmek de sık karşılaşılan bir durumdur. Ancak burada dikkatli olmak gerekir; SSH’ı uzaktan yönetirken restart komutu bağlantıyı kesebilir:
# SSH servisini durumunu kontrol et
service ssh status
# SSH yapılandırmasını yenile (bağlantıyı kesmeden)
service ssh reload
–status-all Parametresi: Tüm Servislerin Durumuna Bakmak
Sistemdeki tüm servislerin durumunu tek seferde görmek istediğinizde --status-all parametresi kullanılır:
service --status-all
Bu komutun çıktısı şöyle görünür:
[ + ] apache2
[ - ] bluetooth
[ + ] cron
[ - ] cups
[ + ] mysql
[ + ] networking
[ - ] nfs-common
[ + ] ssh
Buradaki semboller şu anlama gelir:
- [ + ]: Servis çalışıyor
- [ – ]: Servis çalışmıyor
- [ ? ]: Servisin durumu belirlenemiyor
Bu çıktıyı grep ile filtreleyerek sadece çalışan ya da durmuş servisleri görebilirsiniz:
# Sadece çalışan servisleri listele
service --status-all 2>/dev/null | grep '[ + ]'
# Sadece durmuş servisleri listele
service --status-all 2>/dev/null | grep '[ - ]'
Gerçek Dünya Senaryosu 1: Web Sunucusu Bakımı
Bir web sunucusunu bakıma alıyorsunuz ve sırayla birden fazla servisi durdurmanız gerekiyor. Bu tür senaryolarda genellikle belirli bir sıra izlenir:
#!/bin/bash
# Bakım modu scripti
echo "Uygulama servisleri durduruluyor..."
service apache2 stop
echo "Apache durduruldu."
service php7.4-fpm stop
echo "PHP-FPM durduruldu."
service mysql stop
echo "MySQL durduruldu."
service memcached stop
echo "Memcached durduruldu."
echo "Tüm servisler durduruldu. Bakım başlayabilir."
Bakım bittikten sonra servisleri ters sırada başlatırsınız:
#!/bin/bash
# Bakım sonu servisleri başlatma scripti
echo "Servisler başlatılıyor..."
service memcached start
sleep 2
service mysql start
sleep 3
service php7.4-fpm start
sleep 2
service apache2 start
sleep 2
echo "Tüm servisler başlatıldı."
service --status-all 2>/dev/null | grep '[ + ]'
Gerçek Dünya Senaryosu 2: Servis İzleme ve Otomatik Yeniden Başlatma
Üretim ortamında kritik servislerin düşmesi ciddi sorunlara yol açar. Basit bir izleme scripti yazalım:
#!/bin/bash
# Kritik servis izleme scripti
# /usr/local/bin/service-monitor.sh olarak kaydedin
SERVICES=("apache2" "mysql" "ssh" "cron")
LOG_FILE="/var/log/service-monitor.log"
for SERVICE in "${SERVICES[@]}"; do
STATUS=$(service "$SERVICE" status > /dev/null 2>&1; echo $?)
if [ "$STATUS" -ne 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - UYARI: $SERVICE servisi çalışmıyor! Yeniden başlatılıyor..." >> "$LOG_FILE"
service "$SERVICE" start
# Yeniden başlatma başarılı mı kontrol et
if service "$SERVICE" status > /dev/null 2>&1; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - BILGI: $SERVICE başarıyla yeniden başlatıldı." >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - HATA: $SERVICE yeniden başlatılamadı! Manuel müdahale gerekli." >> "$LOG_FILE"
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - BILGI: $SERVICE çalışıyor." >> "$LOG_FILE"
fi
done
Bu scripti crontab’a ekleyerek her 5 dakikada bir çalıştırabilirsiniz:
# crontab -e ile açıp ekleyin
*/5 * * * * /usr/local/bin/service-monitor.sh
service ile systemctl Arasındaki İlişki
Modern sistemlerde (Ubuntu 16.04+, CentOS 7+, Debian 8+) service komutu aslında bir wrapper olarak çalışır. Systemd tabanlı sistemlerde service apache2 restart yazdığınızda, arka planda systemctl restart apache2 çalıştırılır.
Bunu doğrulamak için strace kullanabilirsiniz:
strace -e execve service apache2 status 2>&1 | grep systemctl
Peki neden systemctl varken service öğrenmek gerekiyor?
- Eski sistemlerde (RHEL 6, CentOS 6)
systemctlyoktur - Docker container’larında çoğunlukla SysVinit benzeri bir yapı kullanılır
- Bazı kurumsal ortamlarda eski dağıtımlar hâlâ kullanılmaktadır
- Otomasyon scriptlerinde geriye dönük uyumluluk kritiktir
/etc/init.d/ Dizini ile İlişki
service komutunun arka planda kullandığı scriptler /etc/init.d/ dizininde bulunur. Bu scripti doğrudan da çalıştırabilirsiniz ancak service komutu daha güvenli ve taşınabilir bir yol sunar:
# Doğrudan init.d scripti çalıştırma (eski yöntem)
/etc/init.d/apache2 restart
# service komutuyla çalıştırma (önerilen)
service apache2 restart
service komutunun avantajı, scripti çalıştırmadan önce temiz bir ortam (environment) oluşturmasıdır. Bu, scriptlerin kullanıcının mevcut ortam değişkenlerinden etkilenmemesini sağlar.
Mevcut init.d scriptlerini listelemek için:
ls /etc/init.d/
Servis Durumu Çıktısını Yorumlamak
service status çıktısını doğru yorumlamak kritik öneme sahiptir. Systemd tabanlı sistemlerde bu çıktı systemctl status çıktısına benzer:
service nginx status
Tipik bir çıktı:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 10:23:45 UTC; 2h 15min ago
Docs: man:nginx(8)
Main PID: 1234 (nginx)
Tasks: 3 (limit: 4915)
CGroup: /system.slice/nginx.service
├─1234 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─1235 nginx: worker process
Burada dikkat edilmesi gereken noktalar:
- Active: active (running): Servis çalışıyor
- Active: inactive (dead): Servis çalışmıyor
- Active: failed: Servis başlatılmaya çalışıldı ancak hata verdi
- enabled: Sistem açılışında otomatik başlar
- disabled: Sistem açılışında otomatik başlamaz
- Main PID: Ana sürecin ID’si
Gerçek Dünya Senaryosu 3: Acil Durum Müdahalesi
Gece 02:00’de bir alarm geldi: web sitesi erişilemiyor. Uzaktan bağlandınız ve hızlı teşhis yapmanız gerekiyor:
# Önce genel duruma bakın
service --status-all 2>/dev/null | grep '[ + ]'
# Web sunucusunu kontrol edin
service nginx status
service apache2 status
# Veritabanını kontrol edin
service mysql status
service postgresql status
# Eğer servis durmuşsa başlatın
service nginx start
# Başlatma başarısız olduysa logları kontrol edin
tail -n 50 /var/log/nginx/error.log
tail -n 50 /var/log/syslog
# Yapılandırma testi yapın (nginx için)
nginx -t
# Yapılandırma doğruysa yeniden başlatın
service nginx restart
Bu tür acil durumlarda sistematik bir yaklaşım çok önemlidir. Önce durum tespiti, sonra müdahale.
condrestart ve force-reload Kullanımı
Bu iki parametre çok bilinmemesine rağmen oldukça kullanışlıdır:
condrestart (conditional restart): Servis zaten çalışıyorsa yeniden başlatır, çalışmıyorsa hiçbir şey yapmaz. Sistem bakımı scriptlerinde çok işe yarar:
# Eğer httpd çalışıyorsa yeniden başlat, çalışmıyorsa bırak
service httpd condrestart
force-reload: Servis reload komutunu destekliyorsa reload, desteklemiyorsa restart yapar:
# Destekleniyorsa reload, değilse restart
service postfix force-reload
Bu parametreler özellikle paket yükseltme scriptlerinde sıkça kullanılır.
Güvenlik Açısından service Komutu
service komutunu kullanmak için genellikle root yetkisi gerekir. Ancak bazı servislerin durumunu sıradan kullanıcılar da görebilir. Yetkisiz kullanıcıların servis yönetimi yapmasını engellemek için sudoers dosyasını dikkatli yapılandırmak gerekir:
# /etc/sudoers dosyasına eklenecek satır (visudo ile düzenleyin)
# Belirli bir kullanıcıya sadece apache2 servisini yönetme yetkisi verin
webadmin ALL=(ALL) NOPASSWD: /usr/sbin/service apache2 *
Bu yapılandırmayla webadmin kullanıcısı şu komutu çalıştırabilir:
sudo service apache2 restart
Ancak başka servislere dokunamaz. Bu, en az yetki prensibi (principle of least privilege) açısından önemlidir.
Dağıtıma Göre service Komutu Farklılıkları
Farklı Linux dağıtımlarında service komutu biraz farklı davranabilir:
Debian/Ubuntu tabanlı sistemlerde:
servicekomutu/usr/sbin/servicekonumundadır- Systemd sistemlerde
systemctl‘e köprü kurar /etc/init.d/scriptleri hâlâ desteklenir
Red Hat/CentOS tabanlı sistemlerde:
- CentOS 6 ve altında doğrudan SysVinit kullanır
- CentOS 7 ve üzerinde systemd’ye köprü kurar
chkconfigkomutuyla birlikte kullanılır (servis açılış ayarları için)
Arch Linux’ta:
servicekomutu varsayılan olarak gelmez- Doğrudan
systemctlkullanılması önerilir
Dağıtım bağımsız script yazıyorsanız şöyle bir kontrol ekleyebilirsiniz:
#!/bin/bash
# Dağıtım bağımsız servis yönetimi
restart_service() {
local SERVICE=$1
if command -v systemctl &> /dev/null; then
systemctl restart "$SERVICE"
elif command -v service &> /dev/null; then
service "$SERVICE" restart
else
/etc/init.d/"$SERVICE" restart
fi
}
restart_service apache2
Yaygın Hatalar ve Çözümleri
Sysadmin olarak en sık karşılaşılan hatalar şunlardır:
Hata 1: “Failed to start” durumu
service mysql start
# Çıktı: Job for mysql.service failed. See 'journalctl -xe' for details.
# Çözüm: Log dosyalarını inceleyin
journalctl -u mysql.service -n 50
tail -n 30 /var/log/mysql/error.log
Hata 2: Port zaten kullanımda
service apache2 start
# Hata: (98)Address already in use
# Çözüm: Hangi sürecin portu kullandığını bulun
ss -tlnp | grep :80
# veya
lsof -i :80
# Süreci sonlandırın ve servisi başlatın
kill -9 <PID>
service apache2 start
Hata 3: Servis adını yanlış yazmak
service apach2 start
# Çıktı: Failed to start apach2.service: Unit apach2.service not found.
# Doğru servis adını bulmak için
service --status-all 2>/dev/null
# veya
ls /etc/init.d/
Pratik İpuçları
Günlük sysadmin işlerinde hayat kolaylaştıran bazı pratik ipuçları:
Birden fazla servisi tek komutla yönetmek için basit bir fonksiyon yazabilirsiniz:
# ~/.bashrc veya ~/.bash_aliases dosyasına ekleyin
restart_web() {
echo "Web servisleri yeniden başlatılıyor..."
service nginx restart && echo "Nginx: OK" || echo "Nginx: HATA"
service php8.1-fpm restart && echo "PHP-FPM: OK" || echo "PHP-FPM: HATA"
service memcached restart && echo "Memcached: OK" || echo "Memcached: HATA"
echo "İşlem tamamlandı."
}
Servis durumunu hızlıca kontrol etmek için kısayol:
# Kısa ve öz durum kontrolü
alias sstat='service --status-all 2>/dev/null | grep "[ + ]"'
Sonuç
service komutu, Linux sistem yönetiminin temel taşlarından biridir. Hem eski SysVinit tabanlı sistemlerde doğrudan, hem de modern systemd sistemlerde bir köprü olarak işlev görür. Start, stop, restart, reload, status gibi temel parametrelerden --status-all ile toplu durum kontrolüne kadar geniş bir kullanım alanı sunar.
Bir sysadmin olarak şunu söylemeliyim: service komutunu ve çalışma prensiplerini anlamak, sizi hem eski sistemleri yönetmekte hem de yeni sistemlere geçişte hazır hale getirir. Gece 02:00’deki acil durumda doğru soruyu sormak, doğru komutu yazmak ve sistemi ayağa kaldırmak için bu temelleri sağlam atmak şart.
Systemd’nin yaygınlaşmasıyla systemctl daha ön plana çıkmış olsa da service komutu hâlâ aktif olarak kullanılmakta ve özellikle eski altyapılarla çalışan ekipler için vazgeçilmez olmaya devam etmektedir. Otomasyon scriptlerinizde geriye dönük uyumluluk istiyorsanız, service komutunu tercih etmek akıllıca bir seçimdir.