Vraag Wat is de juiste procedure om een ​​tussenliggende service op Ubuntu bij te werken?


Stel dat ik twee pakketten heb, A en B, die elk een dienst aanbieden, a en b.

b hangt af van a. Met andere woorden, als service a is momenteel actief (actief), dan kan ik starten en stoppen b geen probleem. Echter, als a is niet actief, b zou niet moeten starten, althans niet zonder eerst te proberen te starten a. Evenzo, als ik wil stoppen a, dan verwacht ik b eerst worden afgenomen a. Dit werkt allemaal geweldig met systemd.

Ik heb een fix toegepast op het pakket A.

Wat is het juiste gedrag van het pakket als ik het gebruik dpkg --install A?

Het lijkt vrij duidelijk dat A mag er niets van weten B. Dus, als het prerm script van A runs:

systemctl stop a

Het zal nemen b samen met het.

Dan de nieuwe versie van A wordt geïnstalleerd en in de postinst Ik start opnieuw a met:

systemctl start a

Is dat de verwachte procedure om een ​​pakket te upgraden zoals A? Zullen systemd op de een of andere manier altijd onthouden herstarten b automatisch? Wat als ik veel meer afhankelijkheden had?


2
2017-08-20 00:08


oorsprong




antwoorden:


In systemd, de systemctl restart werking heeft een speciaal gedrag in vergelijking met een paar stop + start:

  • systemctl restart a - stop b, stop a, start a, start b (dat wil zeggen, herstart afhankelijke eenheden, allemaal in de juiste volgorde)
  • systemctl stop a && systemctl start a - stop b, stop a, start a (dat wil zeggen doet niet onthoud over de afhankelijke eenheden)

Merk op dat dit alleen gebeurt wanneer b.service heeft Requires=a.service. Wants =, After = and Before = schakel dit speciale gedrag niet in (maar After=a.service is hoogstwaarschijnlijk ook nodig om stops en starts tegen elkaar te bestellen).

Dus, om dit te laten werken, moet je waarschijnlijk niets uitvoeren van A's prem script en systemctl restart van A's postrm-script als hun eerste argument is upgradeen normaal systemctl stop + systemctl start anders. (Opmerking: ik heb het hier misschien mis - geen Debian gebruiker / onderhouder),


4
2017-08-20 03:57



Hmmm ... Ik heb nu volledige systeempakketten en de stack werkt bij een herstart. Als ik echter A en B upgrade, is dit afhankelijk van A en de upgrade zal het doen systemctl stop A in preinst (ik denk dat dat preinst) en wanneer de upgrade klaar is, belt het systemctl start A. Wat betekent dat B niet opnieuw wordt opgestart. Ik veronderstel dat dat betekent dat upgrades gewoon helemaal niet werken als je afhankelijkheden hebt? - Alexis Wilke
Twee aanvullende opmerkingen die ook anderen kunnen interesseren: (1) Als u A niet stopt voordat u A hebt geüpgraded, wordt de unpack het proces zal mislukken omdat het op een of andere manier gebeurt systemd beschermt de daemon die niet overschrijfbaar is tijdens het hardlopen; (2) Ik gebruik de dh $@ --with systemd om mijn pakketten te bouwen, dus ik heb niet de controle over welke functie aangeroepen wordt om de start / stop van de daemons te behandelen. - Alexis Wilke