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.