[mythtv-users] delaying backend startup until the network is up

Stephen Worthington stephen_agent at jsw.gen.nz
Tue Dec 11 07:04:34 UTC 2018


On Mon, 10 Dec 2018 17:03:02 -0500, you wrote:

>on my production system I use without issue the systemd override provided by. 
>
>sudo systemctl edit mythtv-backend.service
>
>[Unit]
>After=NetworkManager-wait-online.service
>
>When I built a test system using the same HDHR tuners but with the mythhdhrrecorder external recorder I used the same overide setup. However, if I boot my test system I get a lot of errors on 2-4 tuners and the errors are related to opening the tuner. This is solved by doing the following after boot:
>
>sudo systemctl stop mythtv-backend
>sudo systemctl start mythtv-backend
>
>What is special about mythhdhrrecorder and external recorder blackbox that makes this systemd override not work???
>
>Jim A

Looking at the source code for mythhdhrrecorder, I can see that as it
starts up, it tries to access https://my.hdhomerun.com/discover as
part of its discovery of the HDHR devices.  So it looks like you need
full Internet access up (including the name servers working) before
that will work.  So I think what is needed is a systemd unit that
first does a DNS lookup of my.hdhomerun.com (say once a second), and
when that works, does a ping of my.hdhomerun.com and when that works,
the unit startup succeeds.  Then you can have mythbackend wait for
that unit to be started before it starts.  However, there should be a
timeout (say 30 seconds) after which mythbackend gets to start anyway,
otherwise if your Internet access is down, you will be unable to start
mythbackend.

I have never built a systemd unit like that, but I think it would work
if you wrote a script (or some Python) to do the DNS lookup and ping,
and put it in the ExecStartPre line to be run before the main
executable of the unit gets run from the ExecStart line.  The
ExecStart line would then need to do nothing.  I am not sure how you
are supposed to do nothing in systemd, but running /bin/true should
work.

So a unit "full-internet.service" like this might work:

[Unit]
Description=Wait for full Internet service to be available including
DNS.
After=NetworkManager-wait-online.service

[Service]
Type=simple
ExecStartPre=/usr/bin/python3 /usr/bin/full-internet.py
ExecStart=/bin/true

[Install]
WantedBy=multi-user.target

and in your mythtv-backend override file, use:

After=full-internet.service

The full-internet.py script would handle the DNS lookup, ping, and
timeout after 30 seconds.  It might be a good idea if it took the DNS
name and timeout values as command line parameters, to make it more
generally useful.  I have a script I use for reloading the drivers of
an Ethernet card when the connection drops that I could use for a
framework to make a full-internet.py script.  It does regular pings to
see if the connection is up so it has most of the code I would need.
Let me know if you would like me to do this.  I think this is a
problem that has cropped up in various forms for years, so it would be
worth my writing this if it was going to be useful.


If you want to restart a systemd service, there is a single command
for that:

sudo systemctl restart mythtv-backend


More information about the mythtv-users mailing list