[CentOS] Systemd service unit file needs to wait until a specific interface is up

Thu Sep 24 11:24:54 UTC 2020
Stephen John Smoogen <smooge at gmail.com>

On Wed, 23 Sep 2020 at 23:39, Orion Poplawski <orion at nwra.com> wrote:

> On 9/23/20 7:07 AM, Stephen John Smoogen wrote:
> > On Wed, 23 Sep 2020 at 04:33, Carlos Lopez <clopmz at outlook.com> wrote:
> >
> >> Hi all,
> >>
> >>
> >> With SystemD, how can I make certain service dependent on certain
> network
> >> interfaces being up?
> >>
> >> For example, I have an 802.1ad bond interface I need to wait on for
> being
> >> up (this interface has no ip address assigned, it is used to capture
> >> networks packets with a tcpdump’s script). Every time this service fails
> >> because bond interface is not up.
> >>
> >>
> >>
> >> I have configured the service as:
> >>
> >>
> >> [Unit]
> >>
> >> Description=tcpdump capture script
> >>
> >> After=network.target
> >>
> >> Wants=network-online.target
> >>
> >>
> >>
> >> But it doesn’t work …. Any tip or trick?
> >>
> >>
> >>
> >
> > So the network just calls the scripts and exits so they can take a while
> to
> > get working. I think this website covers what you want to do
> >
> >
> https://unix.stackexchange.com/questions/257888/systemd-wait-for-network-interface-to-be-up-before-running-service
> >
> > systemctl list-units --no-pager | grep subsystem-net
> >
> > Then look for the device which matches the one you are listening to.
> Change
> > the After=network.target to
> >
> >
> > BindsTo=sys-devices-virtual-net-<device>.device
> > After=sys-devices-virtual-net-<device>.device
> >
> > where <device> is the interface you found (aka eth2, br9, bond0 etc)
>
> Hmm, there seems to be several layers here.
>
> I think sys-devices-<device>.device is "started" when <device> appears
> in the kernel:
>
> Sep 23 19:37:25 kernel: virtio_net virtio0 ens3: renamed from eth0
>
> # systemctl status sys-subsystem-net-devices-ens3.device
> ● sys-subsystem-net-devices-ens3.device - Virtio network device
>       Loaded: loaded
>       Active: active (plugged) since Wed 2020-09-23 19:37:25 MDT
>
> This is not what most people would consider "up" - i.e. have an IP
> address.  ens3 doesn't get it's IP address until much later.
>
>

Oh good point. I didn't think about that.


> This works for Carlos though because he doesn't need an IP address -
> just the device existing.
>
>
It may or may not.. I just realized that the device may need to get
recognized by a switch etc which on a bond may take time.


> I have no idea how it worked for the stackexchange poster.  Apparently
> because "lan0" is a virtual device as well
> ("sys-devices-virtual-net-lan0") that they need, not a more "physical"
> device like "net-devices-ens3", and it gets an IP address at the same
> time as creation.
>
> I've been dealing with issues like this for a while - systems with
> multiple interfaces, some of which do not come up for quite a while, and
> I need to wait for all to be up before running certain tasks.  Still
> haven't found anything very satisfactory.
>
>
All good points. Thank you for that douse of reality.



> --
> Orion Poplawski
> Manager of NWRA Technical Systems          720-772-5637
> NWRA, Boulder/CoRA Office             FAX: 303-415-9702
> 3380 Mitchell Lane                       orion at nwra.com
> Boulder, CO 80301                 https://www.nwra.com/
>
>

-- 
Stephen J Smoogen.