[systemd-devel] Launching script that needs network before suspend

Tomáš Hnyk tomashnyk at gmail.com
Tue Jan 25 10:48:16 UTC 2022


On Monday 24. January 2022, 18:56:59 (+01:00), Andrei Borzenkov wrote:

> On 24.01.2022 17:37, Tomáš Hnyk wrote:
> >
> >
> > On Monday 24. January 2022, 13:50:48 (+01:00), Andrei Borzenkov wrote:
> >
>
> I posted it in response to the list and you sent personal reply. Please use
> reply to all.
Sorry about that, my mistake!

> >> On Mon, Jan 24, 2022 at 1:14 AM Tomáš Hnyk <tomashnyk at gmail.com> wrote:
> >>>
> >>> Hello,
> >>> I have my computer hooked up to an AVR that runs my home cinema and ideally I would like the computer to turn off the AVR when I turn it off or suspend it. The only way to do this is over network and I wrote a simple script that does just that. Hooking it to shutdown was quite easy using network.target that is defined when shutting down.
> >>>
> >>> I am struggling to make it work with suspend though. When I look at the logs, terminating network seems to be the first thing that happens when suspend is invoked. I tried putting the script to /usr/lib/systemd/system-sleep/ and it runs, but only after network si down, so it fails. Running the script with systemd-inhibit (ExecStart=/usr/bin/systemd-inhibit --what=sleep my_script) tells me that "Failed to inhibit: The operation inhibition has been requested for is already running".
> >>>
> >>
> >> What network management program are you using?
> > Network Manager. I tried putting "systemctl start NetworkManager.service" into the /usr/lib/systemd/system-sleep/ hook but even though the log says network is reestablished, the script still fails.
>
> NetworkManager has own hooks. Unfortunately there is no hook that runs on
> suspend/resume - only on interface up/down. You may want to post to NM list
> asking whether something like this could be implemented (but it will take
> a long time).
>
> Is performing your action on interface down acceptable? If interface stays
> up all the time except during suspend or shutdown it looks like workaround.

Indeed this works for my setup, wifi is always up. Putting a script to
/etc/NetworkManager/dispatcher.d/pre-down.d executes the script succesfully before suspend. Thank you for the hint!


>
> >
> >>
> >>> Is there a way to make this work with service files by specifying that the script needs to be run before network is shut down or would I need to run a daemon listening for PrepareForSleep as here: https://github.com/davidn/av/blob/master/av ?
> >>>
> >>
> >> Yes, this is probably the only generic solution.
> >>
> > I tried the script I linked and it does not work either (there seems to be a race condition that I am losing). What I am not clear about inhibiting is this: when PrepareForSleep is called and I have a script hooked into it that inhibits sleep, does it inhibit sleep from finishing or from running everything that is triggered by it? To me it seems it will just delay going to sleep, but shutting the network down is not inhibited.
>
> NetworkManage takes sleep lock and subscribes to PrepareForSleep()
> signal, so your daemon races with NetworkManager. There is no way
> to change it - various programs subscribed to PrepareForSleep() are
> not aware of each other at all.
>
> These programs run outside of systemd unit management so you cannot
> use "normal" systemd dependencies to order them.
I see. I assumed systemd ruled it all by now:-). I raised it in their gitlab issue tracker: https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/910

Thanks again for the assistence!
Tomas


More information about the systemd-devel mailing list