StartLimitInterval sonra systemd hizmeti otomatik yeniden başlatma


33

Sistemd hizmetimin başarısızlık durumunda otomatik olarak yeniden başlatılmasını istiyorum. Ek olarak, yeniden başlatmaları sınırlamak istiyorum. 90 saniye içinde maksimum 3 yeniden başlatmaya izin vermek istiyorum. Dolayısıyla aşağıdaki konfigürasyonu yaptım.

[Hizmet]
Yeniden Başlat = her zaman
StartLimitInterval = 90
StartLimitBurst = 3

Artık hizmet başarısızlıkla yeniden başlatılıyor. 3 Hızlı hata / yeniden başlatmanın ardından, beklendiği gibi yeniden başlatılmıyor. Şimdi sistemin zaman aşımından sonra (StartLimitInterval) hizmeti başlatması bekleniyor. Ancak zaman aşımından sonra (90sn) sistemi otomatik olarak başlatmıyor, eğer zaman aşımından sonra hizmeti manuel olarak yeniden başlatıyorsam. Ancak sistemin StartLimitInterval'den sonra otomatik olarak hizmeti başlatmasını istiyorum. Lütfen bu özelliğin nasıl başarılacağını bana bildirin.


3
Nasıl servis yaratılacağını ve bu özel sorundan nasıl kaçınılacağını açıklayan bir makale yazdım: systemd ile Linux servisi oluşturma .
Benjamin

2
Bence aramıştınız StartLimitIntervalSec, değil StartLimitInterval.
Marc Tamsky

Yanıtlar:


30

Bir servisin 90 saniyelik aralıklarla 3 kez yeniden başlatılması için sistemd servis dosyanızda aşağıdaki satırları ekleyin:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Bu, 'Type = idle' komut dosyasını çalıştıran bir hizmet için benim için çalıştı. 'StartLimitInterval' öğesinin 'RestartSec * StartLimitBurst' değerinden büyük olması gerektiğini unutmayın; aksi takdirde hizmet süresiz olarak yeniden başlatılır.

Systemd'nin bu seçenekleri nasıl kullandığını anlamak için çok fazla deneme ve yanılma ile zaman harcadım, bu, systemd'in umduğu kadar iyi belgelenmemiş olduğunu gösteriyor. Bu seçenekler, yeniden deneme döngüsü süresini ve aradığım maksimum yeniden deneme süresini etkili bir şekilde sağlar.


Bu kabul edilmiş cevap olarak işaretlenmiş olmalı ...
Jeff

StartLimitInterval=son ubuntu 18'imde direktif bulamıyorum ...
fitil

10

Açıkladığınız davranış belgelerle tutarlıdır:

StartLimitInterval =, StartLimitBurst = Hizmet başlangıç ​​hızı sınırlamasını yapılandır. Varsayılan olarak, 10 saniye içinde 5 kereden fazla başlatılan servislerin, 10 saniye aralık sona erene kadar daha fazla kez başlatılmasına izin verilmez. Bu iki seçenek ile bu hız sınırlaması değiştirilebilir. Kontrol aralığını yapılandırmak için StartLimitInterval = kullanın (varsayılan olarak DefaultStartLimitInterval = varsayılan olarak yönetici yapılandırma dosyasında, her türlü hız sınırlamasını devre dışı bırakmak için 0 olarak ayarlayın). StartLimitBurst = aralık başına kaç başlatma yapılmasına izin verildiğini yapılandırmak için kullanın (varsayılan olarak varsayılan yapılandırma ayarında DefaultStartLimitBurst =). Bu yapılandırma seçenekleri, Restart = ile birlikte özellikle kullanışlıdır; ancak, bunlar yalnızca Yeniden Başlat = mantık ile tetiklenenler için değil, her türlü başlatmaya (kılavuz dahil) uygulanır.Yeniden Başlat için yapılandırılmış olan ve başlangıç ​​sınırına ulaşan ünitelerin artık yeniden başlatılmaya çalışılmadığını unutmayın; ancak, daha sonra manuel olarak yeniden başlatılabilirler, bu noktadan itibaren yeniden başlatma mantığı tekrar etkinleştirilir. Systemctl reset-fail'in bir hizmetin yeniden başlatma oranı sayacının temizlenmesine neden olacağını ve yöneticinin bir servisi manuel olarak başlatmak istemesi ve başlangıç ​​limitinin buna müdahale etmesi yararlı olacağına dikkat edin.

Hala arzuladığınız davranışı başarmanın bir yolunu bulmaya çalışıyorum.


Bu, belirttiğiniz bir cevaptan daha çok bir yorumdur.
Dave M

tam olarak ihtiyacım olanı, ty
Bazı Linux Nerd

Bağladığınız dokümantasyona göre, StartLimitIntervalSec=(ve DefaultStartLimitIntervalSec=) olmamalı mı? SecHer iki parametre adına eklendiğine dikkat edin.
Doktor J,

6

Birkaç yıl sonra ve 232 numaralı sistemle, soruda ve 2016'nın cevaplarında açıklanan şekilde artık çalışmaz. Seçenek adı StartLimitIntervalSecve Bölümler değişti. Şimdi bu örnek gibi görünmek zorunda:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Bu 30 saniyede 5 yeniden başlatma (5 * 6) artı 33 saniyede bir yeniden başlatma yapar. Bu yüzden 33 saniyede 6 yeniden başlatma var. Bu, 33 saniyede 5 yeniden başlatma sınırını aşıyor. Böylece yeniden başlatmalar yaklaşık 31 saniye sonra 5 sayımda duracaktır.


1
Bölümde StartLimitIntervalbelgelenmemiş ise hala destekleniyor gibi görünüyor Service. Ancak yeni, tercih edilen StartLimitIntervalSecsadece işe yarıyor Unit.
Danek Duvall

1

OnFailureBu başarısız olduğunda başka bir servisi başlatmak için ayarlayabilirsiniz . In on-fail hizmet sen bekler bir komut dosyasını çalıştırmak ve sonra hizmeti yeniden başlatılır olabilir.

Bunun nasıl kurulacağına dair bir örnek için birim arızasında Systemd durum postasına bakın ve servisi yeniden başlatmak üzere değiştirin.


1

Kullanabilirsiniz StartLimitAction=reboot. Bu, StartLimitInterval'den sonra sistemi yeniden başlatacak.

StartLimitAction = StartLimitInterval = ve StartLimitBurst = ile yapılandırılmış hız sınırına isabet edildiğinde yapılacak işlemi yapılandırın. Hiçbiri, yeniden başlatma, yeniden başlatma kuvveti veya yeniden başlatma anında gerçekleşir. Hiçbiri ayarlanmadıysa, oran sınırına basılması, başlatmaya izin verilmemesi dışında hiçbir işlemi tetiklemeyecektir. Yeniden başlatma, normal kapatma prosedürünü izleyerek yeniden başlatmaya neden olur (örn. sistem yeniden başlatmaya eşdeğer). yeniden başlatma kuvveti, tüm işlemleri zorla sonlandıracak olan ancak yeniden başlatma sırasında hiçbir kirli dosya sistemine neden olmayacak (yani, systemctl yeniden başlatma -f'ye eşdeğer) ve yeniden başlatma anında derhal yeniden başlatma (2) sistem çağrısının derhal yürütülmesine neden olacak şekilde bir zorla yeniden başlatmaya neden olur veri kaybı Varsayılan olarak hiçbiri.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.