Linux sunucularında servis yönetimi, sistem stabilitesi ve performans için kritik öneme sahiptir.
Linux sunucularında servis yönetimi, sistem stabilitesi ve performans için kritik öneme sahiptir. Systemd, modern Linux dağıtımlarının varsayılan init sistemi olarak, servisleri etkin bir şekilde yönetmek üzere tasarlanmıştır. Bu makalede, systemd ile servis oluşturma, başlatma, durdurma ve izleme işlemlerini adım adım ele alacağız. Kurumsal ortamlar için systemd’nin sunduğu paralel başlatma, bağımlılık yönetimi ve journald entegrasyonu gibi özellikler, operasyonel verimliliği artırır. Bu rehber, sistem yöneticilerine pratik araçlar sunarak, sunucu yönetimini daha güvenli ve ölçeklenebilir hale getirmeyi amaçlamaktadır.
Systemd, servisleri “unit” dosyaları aracılığıyla tanımlar. Bu dosyalar, /etc/systemd/system/ veya /lib/systemd/system/ dizinlerinde bulunur ve .service uzantılıdır. Bir unit dosyası, [Unit], [Service] ve [Install] bölümlerinden oluşur. [Unit] bölümü, açıklamayı ve bağımlılıkları belirtirken, [Service] çalışma parametrelerini, [Install] ise otomatik başlatma yollarını tanımlar. Systemd’nin avantajı, unit dosyalarının declarative yapısıdır; bu sayede servis konfigürasyonu declarative bir yaklaşımla yönetilir ve hatalar minimize edilir.
Örneğin, basit bir servis unit dosyası şu şekilde oluşturulabilir:
[Unit]
Description=Örnek Servis
After=network.target
[Service]
ExecStart=/usr/bin/python3 /opt/ornek/app.py
Restart=always
User=servisuser
[Install]
WantedBy=multi-user.target
Bu yapı, servisin ağ hazırlandıktan sonra başlamasını, her hata durumunda yeniden başlatılmasını ve belirli bir kullanıcı altında çalışmasını sağlar. Unit dosyalarını düzenledikten sonra, systemctl daemon-reload komutu ile systemd değişiklikleri yüklenir. Bu temel anlayış, ileri seviye yönetim için zorunludur ve sunucu yeniden başlatmalarını gerektirmeden dinamik güncellemeler yapmayı mümkün kılar. Her unit dosyası, systemd’nin cgroups entegrasyonu sayesinde kaynak kullanımını otomatik olarak sınırlar, böylece birden fazla servisin çakışmasını önler.
Yeni bir servis için /etc/systemd/system/ dizinine bir .service dosyası oluşturun. Örneğin, bir Node.js uygulamasını yönetmek istiyorsanız, ExecStart=/usr/bin/node /path/to/app.js satırını ekleyin. Type=simple veya Type=forking gibi tipler seçin; simple, doğrudan çalışan süreçler için uygundur. Dosyayı kaydettikten sonra systemctl daemon-reload ve systemctl enable ornek.service ile etkinleştirin. Bu işlem, sistem başlangıcında otomatik başlatmayı sağlar. Ayrıca, WorkingDirectory ve Environment parametreleri ile çalışma dizini ve ortam değişkenlerini tanımlayın. Bu adımlar, geliştirme ortamından üretim sunucusuna geçişi kolaylaştırır ve tutarlılık sağlar. Test için systemctl start ornek.service kullanın; durumunu systemctl status ornek.service ile kontrol edin.
Servis yönetiminde en sık kullanılan komutlar şunlardır: systemctl start servisadi ile anında başlatma, systemctl stop servisadi ile güvenli durdurma ve systemctl restart servisadi ile kesintisiz yeniden başlatma. Maskeleme için systemctl mask servisadi kullanın; bu, symlink ile unit’i devre dışı bırakır ve kazara başlatmayı önler. Unmask için systemctl unmask servisadi yeterlidir. Bu komutlar, PID dosyası takibi yapmadan süreci yönetir ve sinyal gönderme mekanizmasıyla graceful shutdown sağlar. Kurumsal sunucularda, bu işlemler script’lere entegre edilerek otomasyon sağlanabilir, örneğin bakım pencerelerinde toplu restart için.
Bu komutlar, systemd’nin dependency resolution özelliği ile entegre çalışır; bir servis diğerine bağımlıysa, zincirleme olarak yönetilir. Pratikte, systemctl is-enabled servisadi ile etkinlik durumunu sorgulayın ve gerekirse düzenleyin.
Systemd’nin journald bileşeni, merkezi loglama sağlar. journalctl -u servisadi ile servis loglarını görüntüleyin; -f parametresiyle tail benzeri takip edin. Zaman filtrelemesi için journalctl -u servisadi --since "2023-10-01" kullanın. Log seviyelerini PRIORITY=3 gibi filtrelerle daraltın. Bu araç, syslog’a göre daha verimli olup, binary formatta saklama ile depolama tasarrufu sağlar. Kurumsal ortamlarda, log rotasyonu için Storage=persistent ayarı unit dosyasına ekleyin. Sorun gidermede, journalctl -u servisadi -p err hataları hızlıca listeler ve root cause analizi için idealdir. Ayrıca, forward to syslog için ayarlar yapılandırılabilir.
[Unit] bölümünde Requires= ve After= direktifleri ile bağımlılıkları tanımlayın; örneğin After=postgresql.service bir veritabanı servisi için zorunludur. Restart=always ile çökme durumunda otomatik recovery sağlayın; RestartSec=5 saniye gecikme ekleyin. Bu, high availability için kritik olup, kill mode kontrolü ile süreçleri yönetir. systemctl edit servisadi ile override dosyası oluşturun, ana unit’i değiştirmeden özelleştirin. Bu yaklaşım, paket güncellemelerinde konfigürasyon kaybını önler. Pratik takeaway: Bağımlılık grafiğini systemd-analyze plot > graph.svg ile görselleştirin, boot sürelerini optimize edin.
Systemd ile servis yönetimi, Linux sunucularında standartlaşmış bir yaklaşımdır. Bu rehberdeki adımları uygulayarak, operasyonel hataları azaltabilir, sistem güvenilirliğini artırabilirsiniz. Düzenli daemon-reload ve journalctl kontrolleri ile proaktif yönetim benimseyin; bu, kurumsal ölçekte kesintisiz hizmet sunumu için vazgeçilmezdir. İleri seviye kullanımda, timer ve path unit’leri ile cron benzeri otomasyonlar ekleyin.