Systemd'de bir işlemin durdurulması ve başlatılması arasında gecikme ekleme


10

Gerçekten garip bir sorunum var systemd. Bir sorun systemctl restartçıkardığımda, önceki işlem bitmeden yeni işleme başlayacaktır.

Bu, son kapatma mesajının ("kapanış günlüğü") başlangıç ​​mesajından ("açılış günlüğü") sonra günlüğe kaydedildiği günlüğünde görülebilir.

Durdurma ve işlemin başlaması arasında gecikme eklemenin bir yolu var mı?


Hiçbir şey sizi durduracaksystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti

Neden garip? Gerçek dünyayla ilgili sorunları çözmek için sizi yalnız bırakan bir tasarım özelliğidir. Ünitenizdeki uyku durumuna enjekte edin veya eski örneğin tamamen gittiğinden emin olmak için bir ExecPre koşulu kullanın.
Florian Heigl

Yanıtlar:


13

Systemd hizmet dosyalarınızda, yeniden başlatma için gecikme eklemek üzere RestartSec seçeneğini ayarlayabilirsiniz. Aşağıdaki örneğe bakın:

[Service]
Restart=always
RestartSec=30

Daha fazla örnek için bu bağlantıyı kontrol edin .


1
afaik RestartSecsadece Restart=direktifle yapılandırılmış hizmetler için geçerlidir ve aşağıdakileri yaparken dikkate alınmazsystemctl restart someservice
don_crissti

1

RestartSec, yalnızca belirli bir hizmetin systemctl restart komutu ile yeniden başlatıldığı durumlarda kullanıldığı görülmektedir.

Örneğin, A ve B olmak üzere iki hizmetim var.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

ve

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Bir sistemctl yeniden başlatma B yaparsanız, beklendiği gibi çalışır ... ancak bir systemctl yeniden başlatma A yaparsanız, her iki hizmet de durdurulur ve gecikme olmadan hemen yeniden başlatılır.

Görünüşe göre Systemd, yalnızca belirttiğiniz bir hizmetin yapılandırma değerlerini kullanıyor ve bunları bağımlılıklar için yok sayıyor.

Bu göründüğü kadar nadir değildir. B uzak bir sunucuyla konuşursa, uzak ucun istemciyi reddetmesi nedeniyle hızlı başlatma ve durdurma başarısız olabilir. Ancak A'nın yeniden başlatılması, A, B'de değişiklik yapılmadan güncellendiğinde gerçekleşir.

Muhtemelen A'ya gecikme ekleyerek bu sorunu çözebilirsiniz, ancak bunu yapmanız GEREKMEMELİDİR, çünkü bağımlılık olmadığında A'yı B hakkında bilgi vererek nesne izolasyonunu bozar.

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.