15

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?

3
  • 1
    If I understand correctly, you want sonarr.service and radarr.service to be run after mountgdrive.service is up and running?
    – Dan
    Apr 14, 2018 at 9:33
  • @Dan exactly! the problem is, the way I wrote it apparently mountgdrive.service runs but does nothing (it doesn't mount the drives), and then sonarr.service and radarr.service run normally because ubuntu executed mountgdrive.service Apr 14, 2018 at 9:37
  • 1
    I would also recommend you look into .mount units. If all your mountgdrive.service is doing is mounting a directory or similar, you may be able to change it to a .mount service. As it makes it more reliable specially since you have dependencies on it.
    – Dan
    Apr 14, 2018 at 10:00

1 Answer 1

44
+100

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

  1. After=

    This option only sets the order of the units, it doesn't guarantee that the service has finished starting up.

  2. 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)

  3. 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.

  1. After= is inversed by Before=
  2. Wants= is inversed by WantedBy=
  3. Requires= is inversed by RequiredBy=

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)

6
  • thanks for Wants= and WantedBy=, I'll definitely used them!! I get this error though when I restart the laptop i.imgur.com/a3LE3G9.png Apr 14, 2018 at 10:12
  • 1
    There seems to be an error in the script. You can see it from the line ending with Can't open /.config/SmokeScreen/smokescreen.conf. Maybe you have "~/.config/..." in yoru script. You should replace the tilde (~) with the full path i.e. /home/you_user_name/.config/.... (Or use relative paths to your script)
    – Dan
    Apr 14, 2018 at 10:34
  • github.com/FourFingerLifeHug/SmokeScreen/blob/master/… - this is the check.mount script, so I should change all the $(HOME) and $(bindir) with the full paths? Thanks! Apr 14, 2018 at 10:41
  • 1
    @samsepioldoloresh4ze Yep, $HOME isn't available at boot time, because there isn't a logged in user yet.
    – Dan
    Apr 14, 2018 at 10:42
  • Should WantedBy= be in the [Unit] section? I thought it can only go in [Install].
    – Yankee
    Aug 22, 2019 at 19:58

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.