Dacă creați un Înainte=
si un După=
în dumneavoastră Un serviciu
fișier, veți primi o eroare:
A.service: Job B.service/start șters pentru a întrerupe ciclul de comandă începând cu A.service/start
Pentru că Systemd nu vrea să aibă ambele dependențe de aceeași unitate. Nu cred că niciunul dintre Stare...=
din man systemd.unitate
pe care Michael le-a menționat sunt potrivite pentru sarcina pe care încercați să o îndepliniți, cu excepția cazului în care comenzile dvs. creează și apoi își curăță propriile fișiere. După cum văd eu, aveți două soluții principale posibile:
- Creaza un
ExecCondition=
în dumneavoastră Un serviciu
care rulează o comandă pentru a verifica dacă B.serviciu
rulează.Acest lucru este puțin dificil de făcut doar cu ps și grep din fișierul unității, așa că probabil ați dori să executați un script extern, dar ați spus deja că doriți să evitați un fișier de blocare dezordonat, așa că probabil că nu este ideal.
- Utilizați soluția dezordonată pentru fișierul de blocare pe care ați menționat-o pe care nu ați vrut să o utilizați
- Mutați a doua comandă din
B.serviciu
și într-o ExecStopPost=
opțiunea în Un serviciu
. Aceasta va face ca a doua comandă să ruleze numai după ce prima comandă s-a oprit. De asemenea, va preveni un nou Un serviciu
de la alergare înainte ca primul să se termine complet. Cred că acest lucru vă îndeplinește toate dorințele, de când Un serviciu
comanda si B.serviciu
comanda nu va fi niciodată rulată în același timp, două Un serviciu
comenzile nu vor fi niciodată rulate una lângă alta, iar noile execuții vor fi doar puse în coadă.
Iată fișierul unitar pe care l-am folosit pentru a testa opțiunea 3:
[Unitate]
Descriere = A.service pentru serverfault
[Serviciu]
Tip = oneshot
# A.comandă de serviciu
ExecStart = /usr/bin/sleep 3
# B.comandă de serviciu
ExecStopPost = /usr/bin/sleep 30
Și apoi testat folosind systemctl start A.service
în mod repetat în mai multe ferestre de terminale, monitorizarea progresului cu care procese rulau efectiv la un moment dat ps
.