- Konu sahibi
- #1
Linux servisini açılışta başlatma
Linux'ta bir servisin açılışta otomatik başlaması için sisteminiz systemd kullanıyorsa önce mevcut servis birimini belirleyip
sudo systemctl enable servis.service komutunu çalıştırmanız gerekir. Servisi hemen başlatmak için sudo systemctl start servis.service, ikisini tek adımda yapmak için sudo systemctl enable --now servis.service kullanılır.Ön koşulu kontrol edin
Bu anlatım systemd kullanan dağıtımlar içindir. Önce init sistemini kontrol edin:
Kod:
ps -p 1 -o comm=
Çıktı
systemd ise aşağıdaki yöntemi uygulayabilirsiniz. Farklı bir çıktı alırsanız systemctl komutları doğrudan çalışmayabilir; dağıtımınızın kullandığı init sistemine ait yöntemi kullanmanız gerekir.Çalıştırılabilir örnek servis oluşturma
Paketle gelen servis zaten varsa yeni dosya oluşturmayın;
systemctl cat servis.service ile tanımını inceleyip gerçek adını enable komutunda kullanın. Aşağıdaki ek örnek, modern systemd destekli bir test makinesinde sürekli bekleyen bir işlem oluşturur. Amaç, servis dosyasının doğru yerleştirilmesini ve açılışta etkinleştirilmesini güvenli biçimde doğrulamaktır. Örnek yolların ikisinin de bulunmadığını önceden doğrulayın; varsa mevcut dosyaların üzerine yazmayın ve bu örneğe devam etmeyin. Komutlar sistem servisi oluşturur, sıradan okuma değildir. Terminalde sırayla çalıştırın:- Servis programını oluşturun:
Kod:sudo tee /usr/local/bin/ornek-servis.sh >/dev/null <<'EOF' #!/bin/sh while :; do sleep 60 done EOF sudo chmod 0755 /usr/local/bin/ornek-servis.sh - Systemd birim dosyasını oluşturun:
Kod:sudo tee /etc/systemd/system/ornek-servis.service >/dev/null <<'EOF' [Unit] Description=Ornek Linux servisi [Service] Type=simple DynamicUser=yes ExecStart=/usr/local/bin/ornek-servis.sh Restart=on-failure [Install] WantedBy=multi-user.target EOF - Yeni birim dosyasını systemd'ye okutun:
Kod:sudo systemctl daemon-reload - Servisi hemen başlatın ve sonraki açılışlar için etkinleştirin:
Kod:sudo systemctl enable --now ornek-servis.service - Durumu ve açılışta etkin olup olmadığını kontrol edin:
Kod:systemctl is-enabled ornek-servis.service systemctl status ornek-servis.service --no-pager
Başarılı durumda ilk komut
enabled, durum çıktısında ise Active: active (running) görülür. enable yalnızca açılış bağlantısını oluşturur; --now seçeneği mevcut oturumda da başlatır. Bu örnek dinamik, ayrıcalıksız kullanıcıyla boşta bekler; DynamicUser desteği bulunmayan ortamda ayarı rastgele çıkarmak yerine mevcut dağıtımınızın servis yöntemini kullanın. Deneme tamamlanınca yalnız oluşturduğunuz bu servisi sudo systemctl disable --now ornek-servis.service ile durdurabilirsiniz; dosyaları silmek gerekmez. kendi uygulamanızı kullanacaksanız ExecStart satırını uygulamanın tam yolu ve gerekli parametreleriyle değiştirmelisiniz.Temel systemctl işlemleri
Hangi komutun ne yaptığını bilmek, servisin açılışta çalışmasıyla mevcut anda çalışmasını karıştırmanızı önler.
| Komut | Amacı | Ne zaman kullanılır? |
|---|---|---|
systemctl start servis.service | Servisi şimdi başlatır | Açılış ayarını değiştirmeden deneme yapmak için |
systemctl enable servis.service | Açılışta başlatılmasını etkinleştirir | Kalıcı otomatik başlatma için |
systemctl enable --now servis.service | Etkinleştirir ve hemen başlatır | Yeni kurulumdan sonra |
systemctl disable --now servis.service | Otomatik başlatmayı kaldırır ve çalışıyorsa durdurur | Servisi devre dışı bırakırken |
systemctl restart servis.service | Durdurup yeniden başlatır | Birim dosyası dışındaki ayar değişikliklerinden sonra |
Birim dosyasını değiştirdiğinizde önce
sudo systemctl daemon-reload, ardından çoğu durumda sudo systemctl restart servis.service çalıştırın. Yalnızca programın ayarını değiştirdiyseniz yeniden yükleme gerekebilir; birim dosyasındaki değişiklikler için daemon-reload gereklidir.Başlamıyorsa nasıl teşhis edilir?
Durum çıktısı
failed ise ayrıntıyı şu komutlarla inceleyin:
Kod:
systemctl status ornek-servis.service --no-pager
journalctl -u ornek-servis.service -b --no-pager
203/EXEC benzeri bir hata genellikle ExecStart yolunun yanlış, dosyanın çalıştırılamaz veya betiğin yorumlayıcı satırının hatalı olduğunu gösterir. Unit not found görürseniz dosya adını, .service uzantısını ve daemon-reload adımını kontrol edin. Servis hemen kapanıyorsa ExecStart ile çalıştırılan programı aynı kullanıcı ve aynı tam yol ile terminalde ayrıca test edin.Sistem servisi ile kullanıcı servisi farkı
/etc/systemd/system/ altındaki birim sistem servisi olarak yönetilir ve genellikle root yetkisi ister. Yalnızca kendi kullanıcı oturumunuz için çalışan bir programı açılışta başlatmak istiyorsanız ~/.config/systemd/user/ altında kullanıcı birimi ve systemctl --user enable --now servis.service kullanılır. Kullanıcı servisi çoğunlukla oturum açılınca çalışır; sistem açılır açılmaz, kullanıcı giriş yapmadan çalışması gerekiyorsa uygun sistem servisi veya kullanıcı yöneticisi için ayrıca yapılandırılan lingering seçeneği değerlendirilir.Sık sorulan sorular
Servis dosyasını nereye koymalıyım?
Kendi oluşturduğunuz sistem servisleri için
/etc/systemd/system/ uygundur. Dağıtımın paket yöneticisiyle gelen birim dosyalarını doğrudan değiştirmek yerine gerekirse systemd override yöntemi kullanılmalıdır.Servis yalnızca ağ hazır olduktan sonra başlamalıysa ne yapmalıyım?
Birim dosyasının
[Unit] bölümünde After=network-online.target sıralamasıyla birlikte Wants=network-online.target kullanılır. Ağın gerçekten hazır olmasını bekleyen servislerde ayrıca dağıtımın ilgili ağ-online hedefinin etkin olması gerekebilir; yalnızca After satırı tek başına ağı kurmaz.Kullanıcı giriş yapmadan program çalışabilir mi?
Evet. Programı sistem servisi olarak
/etc/systemd/system/ altında tanımlayın ve gerekli çalışma kullanıcısını birimde User= ile belirtin. Programın dosya ve ortam değişkenlerine bu kullanıcının erişebildiğini ayrıca doğrulayın.