On Sat, Sep 17, 2022 at 6:45 PM Lennart Poettering <lenn...@poettering.net>
wrote:

> On Fr, 16.09.22 10:10, Antonio Murdaca (run...@redhat.com) wrote:
>
> > Hi, following
> >
> https://systemd.io/AUTOMATIC_BOOT_ASSESSMENT/#how-to-adapt-this-scheme-to-other-setups
> > I've been experimenting on a fedora system
> > with systemd-boot-check-no-failures.service and the ability to have
> > services run "after" boot-complete.target. The basic use case would just
> to
> > have something that checks services are up and running, reach
> boot-complete
> > if they are, and start other services afterwards.
> > I've taken from that blog this piece specifically:
> > ```
> > To support additional components that shall only run on boot success,
> > simply wrap them in a unit and order them after boot-complete.target,
> > pulling it in.
> > ```
> > So I've done the following with an example service and by enabling :
> >
> > # cat /etc/systemd/system/test.service
> > [Unit]
> > Description="Order after boot-complete.target, pulling it in"
> > After=boot-complete.target
> > Requires=boot-complete.target
> >
> > [Service]
> > Type=oneshot
> > ExecStart=/usr/bin/echo "Additional component that shall only run on boot
> > success"
> > RemainAfterExit=yes
> >
> > [Install]
> > WantedBy=default.target
> >
> > # systemctl enable test.service  systemd-boot-check-no-failures.service
> > Created symlink /etc/systemd/system/default.target.wants/test.service →
> > /etc/systemd/system/test.service.
> > Created symlink
> >
> /etc/systemd/system/boot-complete.target.requires/systemd-boot-check-no-failures.service
> > → /usr/lib/systemd/system/systemd-boot-check-no-failures.service.
> >
> > # systemctl reboot
> >
> > Unfortunately, the above results in:
> >
> > systemd[1]: multi-user.target: Found ordering cycle on test.service/start
> > systemd[1]: multi-user.target: Found dependency on
> > boot-complete.target/start
> > systemd[1]: multi-user.target: Found dependency on
> > systemd-boot-check-no-failures.service/start
> > systemd[1]: multi-user.target: Found dependency on
> multi-user.target/start
> > systemd[1]: multi-user.target: Job test.service/start deleted to break
> > ordering cycle starting with multi-user.target/start
> >
> > so what's the correct way to perform the mentioned "order [units] after
> > boot-complete.target", if they cannot be pulled in through the usual
> > default/multi-user targets? If I add DefaultDependencies=no to
> test.service
> > it now appears to work w/o the dependency cycle.
>
> It should suffice adding After=multi-user.target to your service.
>
> The things is that systemd-boot-check-no-failures.service runs late,
> after the startup transaction is done to check if everything
> succeeded. But now you want to run something more, so by default
> s-b-c-n-f.s would also want to run after that, to know if it
> succeeded. But htat of course makes little sense: the output of
> your service cannot be part of the input of s-b-c-n-f.s if your
> service should run after s-b-c-n-f.s!
>
> So, my recommended fix: add After=multi-user.target to your
> service. Note that systemd handling of .wants/ works like this:
>
> 1. add Wants= type dep
> 2. if no After=/Before= dep is set, then also add Before=
>
> This means, that just adding an explicit After=multi-user.target to
> your service means rule #2 won't take effect anymore.
>
> With that in place things should just work (untested, but afaics), as
> it means s-b-c-n-f.s can run after multi-user.target, and then
> boot-complete.target after that, and then finally your service.
>
> Does that make sense?
>

that works and makes total sense! thanks! I'd enhance the documentation
around that as it wasn't immediately clear to me that adding After would
result in that though!
thanks!


>
> Lennart
>
> --
> Lennart Poettering, Berlin
>
>

-- 
Antonio (runcom) Murdaca
Principal Software Engineer
B056 8311 87B3 DDEB 25B5 01AF CC5C 9A81 EDCA D821

Reply via email to