[systemd-devel] Antw: [EXT] Re: [systemd‑devel] Waiting for all jobs to finish

Ulrich Windl Ulrich.Windl at rz.uni-regensburg.de
Thu Apr 28 10:34:09 UTC 2022


>>> Lennart Poettering <lennart at poettering.net> schrieb am 28.04.2022 um 10:47
in
Nachricht <YmpUpK5muZtoZoks at gardel-login>:
> On Mi, 27.04.22 18:29, Barry Scott (barry at barrys‑emacs.org) wrote:
> 
>> I have two target files that I use.
>>
>> prod.target is used to start up all the production services.
>> When I use systemctl start prod.target it blocks until all the
>> services are running.
>>
>> I also have prod‑upgrade.target that is used to stop service
>> via Conflicts=. When I use systemctl start prod‑upgrade.target
>> it returns immediately but there are stop jobs running.
>>
>> I believe that this is expected as all the services that need to
>> be started have been.
>>
>> Is there a systemctl command that will wait for all the stop jobs
>> without the need to poll for the systemctl list‑jobs to be empty?
> 
> There is not.
> 
> But the correct way to solve this is by combining Conflicts= with an
> order dep (After= or Before=).
> 
> In systemd the ordering deps After=/Before= control three things:
> 
> 1. The literally define the start‑up order if two units are started,
>    i.e. this is the obvious case: if b.service has After=a.service
>    this means a.service has to finish startup first, before b.service
>    is started.
> 
> 2. If two units are stopped they define the order too, but in
>    reverse. if b.service has After=a.service this hence means that if
>    both are shutdown, then b.service has to stop *before* a.service is
>    stopped, i.e. the opposite order of the start‑up order.
> 
> 3. If one unit is started and one is stopped then the existance of an
>    ordering dep means the stopped unit must complete stopping first,
>    before the starting of the other is initiated. Note that it doesn't
>    mattre if you set After= or Before= here, that doesn#t matter. What
>    matters is that you ordered the unit at all, regardless in which
>    direction.
> 
> Now, this third rule is what matters here: if your target unit has
> Conflicst= on some service, then the target unit should not enter
> active state until the service fully shutdown. Thus you can place
> After= *or* Before= between the two (your choice) and get the desired
> behaviour.

Is there a tool to simulate actions? I mean: List the actions to be started
(not just "start", of course; "stop" is also "started") and the events to wait
for (events to trigger)?

> 
> Lennart
> 
> ‑‑
> Lennart Poettering, Berlin





More information about the systemd-devel mailing list