How can I launch a systemd service at startup before another systemd service starts?
I'm running Ubuntu 16.04 on an old HP Laptop
I've installed some software on it to create a small homemade plex server. I've installed sonarr, radarr, deluge, jackett, etc etc and they all automatically launch at startup!
A couple of days ago I decided to install rclone too and I've created (thanks to a GitHub project) a couple of folders that have to be mounted at each startup by launching a script (I launch it via terminal writing sudo ~/bin/check.mount
). Sonarr and Radarr are set up to download stuff via deluge to a temp folder and then export it to one of these two mounted folders.
The problem is, by the time I manually launch the script Sonarr/Radarr are already up and running and can't find their root folders, so they give me an error.
What I'd like to do is create a mountgdrive.service (service, or whatever is necessary) to automatically launch the check.mount script and, if that's not enough, insert a delay in sonarr.service and radarr.service! Is that possible?
I wrote this with sudo nano /etc/systemd/system/mountgdrive.service
[Unit]
Description=MountSmokeScreen
After=network.target
[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
and added to sonarr.service and radarr.service mountgdrive.service
in the After=
bit, like this
[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service
[Service]
User=samsepioldoresh4ze
etcetc
....
But it's not working! Sonarr and Radarr start normally, but the drives are not mounted! What am I doing wrong?
Also, rtcwake doesn't work on my laptop - I think it's a kernel issue?! Is there a way to fix that?
The reason you are having this problem is because you are using After=
while you also need Requires=
or Wants=
.
There are 3 main properties for managing dependencies. I'll try to briefly explain the difference but you can find more details at [Unit] Section Options | freedesktop.org
-
After=
This option only sets the order of the units, it doesn't guarantee that the service has finished starting up.
-
Wants=
This option allows your unit to start only after another unit has finished starting up. (Doesn't matter if it started successfully or not)
-
Requires=
Just like
Wants=
, however, this will make your unit start only after the dependencies have successfully started.
You can also use the inverse of each of those options.
-
After=
is inversed byBefore=
-
Wants=
is inversed byWantedBy=
-
Requires=
is inversed byRequiredBy=
To fix your problem, you need to change your mount service to:
[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service
[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target sonarr.service radarr.service
Or you can add Wants=mountgdrive.service
to the sonarr.service
and radarr.service
units.
You can do that without modifying the default files by running the following (You need to do the same for radarr.service
):
systemctl edit sonarr.service
And insert the following:
[Unit]
Wants=mountgdrive.service
Note: You can replace Wants=
with Requires
or WantedBy=
with RequiredBy=
if you don't want the two services to start at all if mountgdrive.service
fails (Though Wants=
is usually enough and even recommended in the docs).
EDIT: The WantedBy
and RequiredBy
options can only be used under the [Install]
section. (Thanks @Yankee)