Başka bir hizmet başlatılır veya yeniden yüklenirse Systemd Unit hizmeti yeniden başlatılır


16

Başlarken veya yeniden yüklendiğinde (yalnızca yapılandırmayı yeniden yükle), yeniden Systemdbaşlatma A.service( After) ile sistem tarafından yüklenen ve yükseltilen B.servicedüzenleme olmadan mümkünse bir yol olup olmadığını bilmek istiyorum B.service.

A.serviceB.servicekurulu olmasa, devre dışı bırakılsa veya durdurulsa bile başlamalıdır .

A.service:

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service:

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target

Yanıtlar:


12

Sen kullanabilirsiniz PartOfiçinde [Unit]bölüm.

Misal: PartOf=B.service

Man sayfasından,

PartOf =

Gereksinimler = 'e benzer, ancak birimlerin durdurulması ve yeniden başlatılmasıyla sınırlı bağımlılıkları yapılandırır. Systemd burada listelenen birimleri durdurduğunda veya yeniden başlattığında, işlem bu birime yayılır. Bunun tek yönlü bir bağımlılık olduğunu unutmayın - bu birimdeki değişiklikler listelenen birimleri etkilemez.


Teşekkürler, içine bakıyordum Overriding vendor settingsama bu daha da kolay ve umut verici görünüyor, sadece heyecan dursa Adurmak istemiyorum B, A.restarteğer B.startyine de, yakında biraz test yapacağım ve yönetmenin bir yolu olup olmadığını göreceğim, bildiririm
Alex

@Alex: Ne kullanırsanız PartOfve Restart=alwaysberaber?
Thushi

Restart=Belgelere bakıyorum, oneshothizmetlerle olan davranışın ne olduğundan emin değilim , ama ne olursa olsun: When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restartedB'yi manuel olarak doğru bir şekilde durdurmayı
Alex

Şimdi, ödül otomatik olarak sona erme için kendini tayin etti @ @ Çaba Ben çaba ve öneri için teşekkür ederiz ama PartOfsoru için bir çözüm değil, yine de tadını çıkarın.
Alex

@Alex: Puanlar benim için önemli değil. Puan kazanmanın başka birçok yolu var. Sadece sağlanan çözümün sorununuzu çözüp çözmediğini bilmek istiyorum. Değilse, daha fazla çalışacağız. Nasıl kullanmayla ilgili PartOfolan Restart=always? Bunu denedin mi?
Thushi

3

Ben üzerinde hiçbir kontrolü vardı stopile PartOf=ve Aile durmamalıdır Bben kullanarak sona erdi, böylece geçersiz kılma satıcı ayarlarını , iş gibi görünüyor.

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'

/cmduygulama eşzamansız ve erişmesi /script.shgereken bir kaynağa da erişebiliyorum, (şimdilik) birkaç saniye uyumak için daha iyi bir şey bulamadım.

Doğrudan kullanmadan systemctl [--no-block] try-restartönce kullanmaya çalıştım /script.shama işe yaramadı.


Ben de bu senaryo için bir çözüm arıyorum. Bu çözümü biraz daha açıklayabilir misiniz? veya ne yaptığınızı okumak ve anlamak için bazı dokümanlara bağlantı verin.
zappy

Merhaba @zappy, kılavuzu man systemd.unitarayın (veya yüklü değilse çevrimiçi arayın) ve "Satıcı ayarlarını geçersiz kılma" bölümünü arayın.
Alex

Girişiniz için teşekkürler. Yukarıdaki yöntemi yalnızca B hizmeti satıcıya özgü olduğu ve bu hizmet dosyasını düzenlemek istemediğiniz için seçtiğinizi anlıyorum. Ama benim durumumda hem A hem de B hizmeti satıcı tarafından sunulmuyor. Geçersiz kılmanın sisteme karmaşıklık katabileceğini hissediyorum. Başka seçeneğimiz var mı?
zappy

Soru birkaç yaşında, belgeleri kontrol ettiniz mi? Belki bu senaryo o zamandan beri ele alınmıştır. Acelem vardı ama zamanım varsa sistemd resmi e-posta listesini arar ve oraya sorarım, sonunda bir sorun açar
Alex

1

Şu anda systemd bu senaryonu kapsamıyor. Bu işlevselliği yalnızca servis dosyaları aracılığıyla gerçekleştiremezsiniz. Bir olasılık, systemctl'i aynı ada sahip bir kabuk komut dosyası aracılığıyla ele geçirmektir ve bu kontrolde B.service'in yeniden başlatılacak veya yeniden yüklenecek olup olmadığını görmek için A.service ile de uygun eylemi yapın ve gerekirse rc.local, önyüklemede de uygun duruma ulaşmak için. Docker.service ve networking.service ile bu sorunu var, ama ben her zaman onları birlikte yeniden başlatın:

systemctl yeniden başlat docker.service networking.service

Açıkçası, eğer systemd kendisi B.service'i dahili olarak manipüle ederse (örneğin diğer servis dosyaları aracılığıyla) etkili olmaz.

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.