SystemD N işlemlerini doğurur mu?


13

Kuruluşumda, bir dizi kuyruk tüketen işçi süreçlerimiz var. Şu anda onları yönetmek için SupervisorD kullanıyoruz, ancak burada belirli avantajlar için mümkünse SystemD kullanmak istiyoruz. Özel birimler yazma konusunda oldukça deneyimliyim, ancak bunun için SystemD arazisinde hemen bir analogum yok.

In SupervisorD belgelerinde adı verilen bir parametre numprocstek onlar servisle başlatılacaktır istiyorum süreçlerin sayısını ayarlamak için izin veren ayrıntılı. 30 işlemin başlamasını istiyorsam, bu tek satırlık bir değişikliktir.

SystemD birimlerinde bu işlemlerden kaçının başlatılmasını istediğimi belirtmemi sağlayacak bir ayar var mı?


1
Aynı birimin birden fazla örneğini oluşturmaya mı çalışıyorsunuz? Eğer öyleyse, 0pointer.de/blog/projects/instances.html
Munir

Yanıtlar:


31

Munir'in bahsettiği tam olarak bunu nasıl yaptığınızdır. Temel olarak bir servicedosya oluşturur ve 30 kez başlatırsınız. Şimdi bu biraz tuhaf görünebilir, ancak yanlış davranırsa bunlardan birini kapatabilme ve hepsini kapatmak zorunda kalmamak gibi avantajları vardır. Ayrıca yönetimi kolaylaştırmak için yapabileceğiniz bazı şeyler vardır.

İlk olarak, birim dosyası. Gibi bir dosya oluşturun /etc/systemd/system/test@.service. Önemli olan @sembol.

İçeriği şöyle görünebilir:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

Sonra bunu başlatmak systemctl start test@1.service, systemctl start test@2.service.
Başlatılan işlemler şöyle görünecektir:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Başladığınız andan %Isonra koyduğunuz şeyle değiştirildiğine dikkat edin @.

Tüm 30'a küçük bir kabuk-fu ile başlayabilirsiniz:

systemctl start test@{1..30}.service

Ayrıca herhangi bir normal hizmeti gibi açılışta etkinleştirebilirsiniz: systemctl enable test@1.service.

 

Şimdi, yönetimi kolaylaştırmak için yapabileceğiniz şeylerle kastettiğim: Belki de test@{1..30}.servicehepsini yönetmek için kullanmak istemezsiniz . Biraz hantal. Bunun yerine hizmetiniz için yeni bir hedef oluşturabilirsiniz.

Şununla oluştur /etc/systemd/system/test.target:

[Install]
WantedBy=multi-user.target

Ardından, /etc/systemd/system/test@.serviceşu şekilde görünecek şekilde ayarlayın :

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

Systemd ile yeniden yükleyin systemctl daemon-reload(yalnızca birim dosyasını değiştiriyorsanız gereklidir ve önceki sürümünü atlamıyorsanız). Ve şimdi yönetilmesini istediğiniz tüm hizmetleri yaparak etkinleştirin systemctl enable test@{1..30}.service.
(Hizmeti daha önce olduğu gibi etkinleştirdiyseniz WantedBy=multi-user.target, bağımlılığı temizlemek için önce devre dışı bırakın)

Şimdi yapabilirsiniz systemctl start test.targetve systemctl stop test.target30 işlemin tümünü başlatır / durdurur.
Ve yine, başka birim dosyası gibi açılışta etkinleştirebilirsiniz: systemctl enable test.target.


Bu ayrıntılı cevap için teşekkür ederim, bunu birkaç gün aradım.
arnolem

1
Bunun başarısız olan işlemleri yeniden başlatacağını biliyor musunuz?
bastian

@bastian: kullanabilirsiniz Restart=on-failure. systemd.serviceDaha fazla bilgi için kılavuz sayfasını okuyun .
siride

1

İşte bir virtualenv çalışan bir python komut dosyası kullanarak benim örnek:

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

Devre Dışı: sudo systemctl enable my-worker\@{1..30}.service

N çalışanını etkinleştir: sudo systemctl enable my-worker\@{1..2}.service

Tekrar yükle: sudo systemctl daemon-reload

Başlat: sudo systemctl start my-worker@2.service

Durumu kontrol et: sudo systemctl status my-worker@1

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.