Systemd: Bir Örneklendirilmiş Hizmetin tüm örneklerini aynı anda yeniden başlatın


17

Systemd'ın güzel özelliğini kullanıyorum: Instantiated Services.

Tüm somutlaştırılmış hizmetleri tek bir çağrı ile yeniden yüklemenin basit bir yolu var mı?

Örnek: Tüm bu şekilde çalıştırmak istemiyorum:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

Bunu denedim, ama bu işe yaramıyor

systemctl restart autossh@*

İlgili: N işlemlerini tek bir systemd hizmet dosyasıyla başlat

Güncelleme

İlk önce Instantiated Services tarafından büyülenmiştim, ancak daha sonra Ansible gibi bir yapılandırma yönetimi aracı çalıştırmanın daha mantıklı olduğunu fark ettim. Öğrendim: Araçları basit tutun. Birçok araç durum kontrolü (eğer .. else ...) ve döngüler uygulamaya başlar. Örneğin web sunucuları veya posta sunucusu yapılandırması. Ancak bu farklı (üst) bir seviyede çözülmelidir: konfigürasyon yönetimi. Bkz. Https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

Yanıtlar:


23

Systemd (systemd-209'dan başlayarak) joker karakterleri destekler, ancak kabuğunuz muhtemelen bunları genişletmeye çalışmaktadır. Joker karakterleri systemctl / service command kelimesine aynen geçirmek için tırnak işaretleri kullanın:

systemctl restart 'autossh@*'

Benim için çalışmıyor: systemctl status 'autossh@*'çıktı: autossh@\x2a.service - ... Active: inactive (dead)Sürüm:systemd 195
guettli

2
Globbing, sistem 209'dan başlayarak kullanılabilir: lists.freedesktop.org/archives/systemd-devel/2014-Şubat /…
weirdan

Yeniden başlatmak için çok fazla hizmetiniz varsa, joker karakter hepsini bir kerede yeniden başlatmaya çalıştığından, guettli'nin cevabındaki while döngüsü daha iyi çalışacaktır. ~ 1000 php-fpm hizmetleriyle test edildi, yük 400'e kadar çıktı ve sunucuyu yeniden başlatmak zorunda kaldım.
boutch55555

1
İşlemler zaten çalışıyorsa çalışır, ancak etkinleştirildikten sonra ilk kez başlatılması gerekiyorsa çalışmaz. Ama biraz daha az genel olan systemctl restart autossh@{1..2}(yerine herhangi bir N ile) kullanabilirsiniz 2, ancak eğer varsa, süreçleri de başlatacaktır inactive (dead).
17:21

7

Hoş değil, ancak bu eski bir systemd olan sistemler için çalışır:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

Elbette yukarıdaki cevap ( systemctl restart 'autossh@*') ' dan gelen çözüm daha iyidir.


Dikkat: cutliste birimleri çıktısında başarısız hizmetler olması durumunda yanlış alanı ayrıştırabilir.
Juuso Ohtonen

5

@weirdan Yanıt doğru, ancak belirli dağıtımlar için bir şey eksik.

For Centos 7 ve benzeri , bunu yapabilirsiniz:

systemctl (start|stop|restart|status) my-service@*

AMA, (start) SADECE "--all" işaretini belirtirseniz çalışır:

systemctl (start) my-service@* --all

Aksi takdirde, varolmadığı için hizmetleri bulamazlar. Bu sistemd amaçlı bir özelliktir.

İçin Ubuntu tabanlı sistemlerde aksi takdirde hiçbir şey yapmayacağım, bu hemen hemen aynı şekilde çalışır, ancak fark "--Tüm" bayrak systemctl argümanların tümü için belirtilmesi gerekir olmasıdır.

systemctl (start|stop|restart|status) 'my-service@*' --all

2

Systemd için terminalde bir joker için bir seçenek olup olmadığını bilmiyorum. Yapabileceğiniz şey, systemd komut dosyalarınıza bir tane eklemektir.

% İ düşünüyorum hile yapardı ama örnekleme hizmetleri komut dosyası ile ilgili.

Burada belirtici olarak adlandırılan bir açıklama bulabilirsiniz.

ki bunu gösterir:

% n

tam birim adı

% p

Örneklenen birimler için bu, birim adının "@" karakterinden önceki dizeyi ifade eder. Örneklenmemiş birimler için bu, sonek türü kaldırılmış birimin adını ifade eder.

%ben

Örneklenen birimler için: bu, "@" karakteri ile birim adının soneki arasındaki dizedir. Birim adı

Sorunuza doğrudan cevap vermiyorum, ama sanırım elde etmeye çalışıyorsunuz. Çözümünüzün bu fikri izleyerek bulunabileceğini düşünüyorsanız, lütfen systemd betiğinizi paylaşın, böylece sonunda örneklerle açıklayabilir ve hatta size son betiği bile sağlayabiliriz.

Bu şekilde bir çözüme ulaşmak için kendi komut dosyanızı düzenlemede kendinize güveniyorsanız, burada bir örneğiniz var (çözümle alakalı olup olmadığını bilmediğim için alıntı yapmayacağım ve benim için çok özel m teklif)

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.