- Konu sahibi
- #1
Systemd servis dosyası nasıl okunur?
Systemd servis dosyasını okumaya, dosyanın hangi programı hangi koşullarda çalıştırdığını bulmakla başlayın:
[Unit] bağımlılıkları ve başlama sırasını, [Service] çalıştırma biçimini, [Install] ise hangi hedefe bağlanacağını anlatır. Önce gerçek dosyanın içeriğini görüntüleyin, ardından ExecStart, kullanıcı, çalışma dizini, ortam değişkenleri ve yeniden başlatma davranışını birlikte değerlendirin.Dosyayı ve etkin ayarları bulma
Bir servisin hangi dosyadan yüklendiğini ve içeriğini görmek için servis adını
.service ekiyle veya eksiz kullanabilirsiniz:- Ana unit ve varsa drop-in dosyalarını sırayla görüntüleyin:
systemctl cat nginx.service. Bu çıktı ana dosyayı ve varsa ek yapılandırma parçalarını gösterir. - Systemd'nin etkin ayarlarını satır satır görmek için
systemctl show nginx.servicekomutunu çalıştırın. Bu çıktı yöneticinin belleğe aldığı değerleri gösterir; diskte düzenlenmiş fakat daemon-reload yapılmamış dosyadan farklı olabilir. Çıktıyı paylaşmadan önce Environment ve benzeri alanlardaki sırları ayıklayın. - Dosyanın sözdizimini kontrol edin:
systemd-analyze verify /etc/systemd/system/ornek.service. Hata yoksa komut genellikle ek çıktı vermeden tamamlanır; hata varsa satır ve direktif bilgisine göre düzeltme yapın. - Çalışma durumunu ve son günlükleri birlikte inceleyin:
systemctl status nginx.servicevejournalctl -u nginx.service. Dosyanın doğru görünmesi, programın başarıyla başlayacağı anlamına gelmez.
Dosyanın konumunu ayrıca kontrol etmek isterseniz
systemctl show -p FragmentPath nginx.service komutu systemd'nin kullandığı ana dosyanın yolunu gösterir. Dağıtım tarafından sağlanan dosyayı doğrudan değiştirmek yerine, değişiklik gerekiyorsa uygun bir drop-in yapılandırması kullanmak genellikle daha güvenlidir.Bölümleri okuma yöntemi
Aşağıdaki dosya okuma örneğidir; appuser hesabı, Python yorumlayıcısı, dizin ve program önceden yoksa çalışır servis değildir. Mevcut birime bu yolları körlemesine taşımayın:
Kod:
[Unit]
Description=Örnek web uygulaması
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/ornek
ExecStart=/usr/bin/python3 /opt/ornek/app.py
Restart=on-failure
Environment=APP_ENV=production
[Install]
WantedBy=multi-user.target
Bu dosyayı yukarıdan aşağıya şu şekilde yorumlayın:
-
[Unit]içindekiDescriptionyalnızca açıklamadır.Afterbaşlama sırasını düzenler; tek başına belirtilen hedefin başarıyla başlamasını zorunlu kılmaz.Wantsise ilgili hedefi veya unit'i de istemek için kullanılır. -
[Service]asıl çalışma davranışıdır.Type=simple,ExecStartile başlatılan sürecin ana servis süreci olarak izlenmesini ifade eder.Userprogramın hangi kullanıcıyla,WorkingDirectoryhangi dizinden çalışacağını belirler. -
ExecStartçalıştırılacak komutu ve argümanlarını belirtir. Buradaki yolların gerçekten var olması ve programın bu kullanıcı tarafından çalıştırılabilir olması gerekir. -
Restart=on-failureyalnızca başarısız sonlanan durumda yeniden başlatma davranışı ister. Bu direktif, uygulamadaki her hata türünün otomatik olarak düzeltileceği anlamına gelmez. -
[Install]etkinleştirme ilişkisini tanımlar.WantedBy=multi-user.target, servis etkinleştirildiğinde çok kullanıcılı normal açılış hedefine bağlanmasını sağlar; servisin o anda çalışıp çalışmadığını tek başına göstermez.
Bir servisin neden başlamadığını araştırırken önce
ExecStart satırındaki komutu kabuk değişkenlerine güvenmeden değerlendirin. ExecStart normal bir etkileşimli kabuk değildir; yönlendirme, pipe veya && operatörleri kendiliğinden çalışmaz. Systemd kendi sınırlı ortam değişkeni genişletmesini destekler; bunu kabuk sözdiziminin tamamı sanmayın. Ayrıca Environment satırındaki değerler, etkileşimli terminalinizdeki ortamla aynı olmayabilir.Direktifleri hızlı yorumlama tablosu
Aynı dosyada birden fazla benzer direktif bulunduğunda bunların görevlerini karıştırmamak için şu ayrımı kullanın:
| Direktif | Baktığı konu | Yanlış yorum |
|---|---|---|
| After= | Başlama sırası | Bağımlı servisin hazır olduğunu garanti eder |
| Requires= | Bağımlılık ilişkisi | Her zaman başlatma sırasını belirler |
| ExecStart= | Başlatılacak komut | Her zaman kabuk içinde çalışır |
| WantedBy= | Etkinleştirme hedefi | Servisin anında başlatılmasıdır |
Örneğin
After=network-online.target yalnızca ağ hedefinden sonra başlama sırası ister. Uygulamanın gerçekten ağ bağlantısı kurabildiğini görmek için servis günlüklerini ve uygulamanın kendi hata çıktısını da incelemelisiniz.Okuma sonrası uygulanacak kontrol
Bir satırı değiştirdiyseniz önce
systemd-analyze verify ile biçimi kontrol edin. Ardından systemd'nin değişikliği görmesi için systemctl daemon-reload çalıştırın; bu komut servisi kendiliğinden yeniden başlatmaz. Servisi kontrollü olarak başlatıp sonucu systemctl status ve journalctl -u servis.service ile doğrulayın. Başarısızlıkta özellikle çıkış kodu, eksik dosya, izin, kullanıcı ve çalışma dizini bilgilerine bakın.Sık yapılan hatalar
Dosyada yazan ile etkin değeri karıştırmak: Drop-in dosyaları, şablon servisler ve varsayılan değerler nedeniyle yalnızca ana dosyayı okumak yanıltıcı olabilir.
systemctl cat ve systemctl show çıktısını birlikte değerlendirin.After ile Requires'ı aynı sanmak: Biri esas olarak sıralamayı, diğeri bağımlılık ilişkisinin yaşam döngüsünü etkiler. Servisin gerçekten ihtiyaç duyduğu kaynak için uygun bağımlılık direktifi ayrıca incelenmelidir.
ExecStart'ı terminal komutu gibi test etmek: Terminalde çalışan komut; farklı kullanıcı, dizin veya ortam nedeniyle systemd altında çalışmayabilir. Önce dosyadaki
User, WorkingDirectory ve ortam ayarlarını karşılaştırın.Sık sorulan sorular
Bir servis dosyasını değiştirdikten sonra neden değişiklik görünmüyor?
Systemd dosyaları belleğe alabilir. Değişiklikten sonra
systemctl daemon-reload çalıştırın; çalışan sürecin yeni ayarlarla devam etmesi için ayrıca servisi yeniden başlatmanız gerekir.Servisin etkin olması ile çalışıyor olması arasındaki fark nedir?
Etkin servis açılışta hangi hedefle ilişkilendirileceğini belirtir. Çalışıyor olması ise o anda süreç oluşturulup oluşturulmadığını gösterir; bu iki durumu
systemctl is-enabled ve systemctl is-active ile ayrı ayrı kontrol edin.