Orion Poplawski
2020-Sep-24 03:39 UTC
[CentOS] Systemd service unit file needs to wait until a specific interface is up
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. This works for Carlos though because he doesn't need an IP address - just the device existing. 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. -- 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 John Smoogen
2020-Sep-24 11:24 UTC
[CentOS] Systemd service unit file needs to wait until a specific interface is up
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.
Simon Matter
2020-Sep-24 11:41 UTC
[CentOS] Systemd service unit file needs to wait until a specific interface is up
> 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.I'm just wondering, is there a chance to make this work reliable without modifying the source code of systemd? Simon
Apparently Analagous Threads
- Systemd service unit file needs to wait until a specific interface is up
- Systemd service unit file needs to wait until a specific interface is up
- Systemd service unit file needs to wait until a specific interface is up
- Systemd service unit file needs to wait until a specific interface is up
- Systemd service unit file needs to wait until a specific interface is up