SystemD ha generato processi N?


13

Nella mia organizzazione, abbiamo una serie di processi di lavoro che consumano la coda. Attualmente stiamo usando SupervisorD per gestirli, ma vorremmo usare SystemD se possibile per alcuni vantaggi. Ho abbastanza esperienza con la scrittura di unità personalizzate, ma non ho immediatamente un analogo in SystemD land per questo.

Nella documentazione di SupervisorDnumprocs viene descritto un parametro chiamato che consente di impostare il numero di processi che desiderano avviare con il servizio. Se voglio che vengano avviati 30 processi, è una modifica di una riga.

Esiste un'impostazione nelle unità SystemD che mi permetterà di specificare quanti di questi processi vorrei iniziare?


1
Stai cercando di creare più istanze della stessa unità? In tal caso, potresti dare un'occhiata a 0pointer.de/blog/projects/instances.html
Munir,

Risposte:


31

Ciò che Munir ha menzionato è esattamente come lo fai. Fondamentalmente si crea un servicefile e lo si avvia 30 volte. Ora può sembrare un po 'imbarazzante, ma ha dei vantaggi, come essere in grado di chiuderne uno se si comporta male e non doverli chiudere tutti. Ci sono anche alcune cose che puoi fare per semplificare la gestione.

Innanzitutto, il file dell'unità. Creare un file, ad esempio /etc/systemd/system/test@.service. Il bit importante è il @simbolo.

I suoi contenuti potrebbero apparire come:

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

[Install]
WantedBy=multi-user.target

Quindi avviare con systemctl start test@1.service, systemctl start test@2.service.
I processi che verranno lanciati saranno simili a:

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

Si noti che è %Istato sostituito con tutto ciò che si inserisce dopo il @momento in cui è stato avviato.

Puoi iniziare tutti e 30 con un po 'di shell-fu:

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

È inoltre possibile consentire loro in fase di boot come qualsiasi normale servizio: systemctl enable test@1.service.

 

Ora, cosa intendevo con cose che puoi fare per semplificare la gestione: forse non vuoi usarlo test@{1..30}.serviceper gestirle tutte. È un po 'ingombrante. Puoi invece creare un nuovo target per il tuo servizio.

Crea /etc/systemd/system/test.targetcon:

[Install]
WantedBy=multi-user.target

Quindi regolare in /etc/systemd/system/test@.servicemodo che appaia:

[Unit]
StopWhenUnneeded=true

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

[Install]
WantedBy=test.target

Ricarica systemd con systemctl daemon-reload(necessario solo se si sta modificando il file di unità e non si è saltato la versione precedente di esso). E ora abilita tutti i servizi che vuoi gestire facendo systemctl enable test@{1..30}.service.
(Se in precedenza avevi abilitato il servizio mentre lo era WantedBy=multi-user.target, disabilitalo prima per cancellare la dipendenza)

Ora puoi fare systemctl start test.targete systemctl stop test.target, e avvierà / fermerà tutti e 30 i processi.
E ancora, è possibile attivare al caricamento del sistema come qualsiasi altro file unità: systemctl enable test.target.


Grazie per questa risposta dettagliata, ho cercato questo per diversi giorni.
Arnolem,

1
Sai se questo riavvierà i processi che falliscono?
Bastian,

@bastian: puoi usare Restart=on-failure. Leggi la systemd.servicepagina man per saperne di più.
siride,

1

Ecco il mio esempio usando uno script Python che gira in virtualenv:

/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

Disattivare: sudo systemctl enable my-worker\@{1..30}.service

Abilita N lavoratori: sudo systemctl enable my-worker\@{1..2}.service

Ricaricare: sudo systemctl daemon-reload

Inizio: sudo systemctl start my-worker@2.service

Controllare lo stato: sudo systemctl status my-worker@1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.