service Komutu ile Linux Servis Yönetimi ve Kontrolü

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) systemctl yoktur
  • 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:

  • service komutu /usr/sbin/service konumundadı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
  • chkconfig komutuyla birlikte kullanılır (servis açılış ayarları için)

Arch Linux’ta:

  • service komutu varsayılan olarak gelmez
  • Doğrudan systemctl kullanı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.

Yorum yapın