linuxnetwork-programmingsshsystemd

systemd: start service at boot time after network is really up (for WoL purpose)


I have a computer at work which I sometimes wakeup from home in order to access it but when boots and gets another IP address from our DHCP server, how can I access it?

The situation and my “workflow” is as follows:

Now in theory I'd be able to SSH to my office PC if only I'd knew its IP address. Sometimes it gets the same, sometimes it changes. To circumvent this I had the following idea:

All computers run Linux; Ubuntu 14.04 at home, SLES on the office server, OpenSUSE 13.1 on my office PC. This is all not a problem.

For this all to work I simply need a script on my office PC that runs at boot time when the network is up and running.

My script (publish_ip.sh) is like follows:

# get own IP address:
ip=$(ip addr show | awk '$1=="inet" && $2 !~ /127\.0\.0\.1/ { split($2, a, "/"); print a[1]}');

# SSH to the office server (10.64.5.84) and write own IP address to a file there:
ssh -x -e none 10.64.5.84 "echo $(date) $ip >> office_pc_address.txt"

To run this script at boot time I created a systemd service file, publish-ip.service, for my office PC:

[Unit]
Description=publishes own IP address
Wants=network.target
After=network.target

[Service]
Type=oneshot
ExecStartPre=/usr/bin/sleep 30
ExecStart=/home/perldog/bin/publish_ip.sh
User=perldog

[Install]
WantedBy=multi-user.target

But this is what I always get on my office PC:

linux-tz7m:/usr/lib/systemd/system # systemctl status publish-ip.service
publish-ip.service - publishes own IP address
   Loaded: loaded (/usr/lib/systemd/system/publish-ip.service; enabled)
   Active: failed (Result: exit-code) since Mon 2016-02-29 12:17:34 CET; 4 days ago
  Process: 1688 ExecStart=/home/perldog/bin/publish_ip.sh (code=exited, status=255)
  Process: 1016 ExecStartPre=/usr/bin/sleep 30 (code=exited, status=0/SUCCESS)
 Main PID: 1688 (code=exited, status=255)

Feb 29 12:17:34 linux-tz7m publish_ip.sh[1688]: ssh: connect to host 10.64.5.84 port 22: Network is unreachable

Obviously my service starts and also calls my script but the SSH command in that script fails with Network is unreachable.

I tried everything in my service file so that it runs only after the network is up, but I don't get it. I tried Wants=network.target, After=network.target, WantedBy=multi-user.target, and even inserted an ExecStartPre=/usr/bin/sleep 30. Nothing worked. I always get Network is unreachable when my script is called and tries to SSH to the office server.

Question: What settings are required in my service file so that it runs only after the office server is reachable with SSH?

Note: When I'm at the office and my office PC is up-and-running, both my script and the service work perfectly, i.e. systemctl start publish-ip.service works without any error.


Solution

  • I tried all these targets, and they all were reached before DHCP got an IP address. Go figure:

    What did work was enabling these two:

    systemctl enable systemd-networkd.service systemd-networkd-wait-online.service
    

    And then setting

    [Unit]
    After=systemd-networkd-wait-online.service
    Wants=systemd-networkd-wait-online.service
    

    Now it got started after DHCP got an IP address. (A mount point in my case, but could have been your service too)

    (On debian9/stretch)