10

I am running Arch Linux. I have a service on /etc/systemd/system/ with the following description

[Unit]
After=network.target

[Service]
Type=simple
ExecStart=(...)service.py
ExecReload=(...)service.py
Restart=always

I set it to start after the network is established as it depends on a network connection.

When I boot the PC, the service is always inactive. If I start it manually it runs perfectly. It also restarts if there is some internal error. Why does it not start on boot?

EDIT

When enabling the service I get this message:

➜  ~ systemctl enable py_service.service                                                                                                                     
The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
1) A unit may be statically enabled by being symlinked from another unit's
   .wants/ or .requires/ directory.
2) A unit's purpose may be to act as a helper for some other unit which has
   a requirement dependency on it.
3) A unit may be started when needed via activation (socket, path, timer,
   D-Bus, udev, scripted systemctl call, ...).
4) In case of template units, the unit is meant to be enabled with some
   instance name specified.`

Concerning these points:

  1. it is not symlinked

  2. it is not a helper

  3. I thought this was covered by the After=network...

  4. I do not know what this means

EDIT 2 Following the suggestion of @dustball, I edited to:

cat /etc/systemd/system/py_service.service 
[Install]
WantedBy=multi-user.target

[Unit]
After=network.target

[Service]
Type=simple
ExecStart=(...)service.py
ExecReload=(...)service.py
Restart=always

But it did not start on boot :(

EDIT 3 The above configuration works, I forgot to enable it (thanks to @Daniel H) reload the services using

sudo systemctl daemon-reload

and then enable it using

systemctl enable py_service.service
6
  • 1
    Have you enabled the service? Also, this question might be better suited for Unix & Linux Commented Jan 16, 2017 at 13:45
  • Have you considered adding a WantedBy, RequiredBy or some of the other suggested fields to the unit?
    – Wieland
    Commented Jan 17, 2017 at 13:26
  • @Wieland I do not know what to add there as it is a contained service. Any suggestions?
    – Camandros
    Commented Jan 17, 2017 at 17:33
  • Have you tried looking at the journal, with journalctl --unit <unit name> for example?
    – airhuff
    Commented Jan 18, 2017 at 5:57
  • the journalctl shows that if the service crashes it correctly restarts, but after boot there is no data, the service starting was done manually by me
    – Camandros
    Commented Jan 18, 2017 at 11:19

1 Answer 1

18

The error message already gives you the answer (partially). Services have an [Install] section. The only option in there is "WantedBy=". For a service to be enabled, it must be wanted by a target.

Example: NetworkManager has "WantedBy=network.target", so when you enable NetworkManager, it's grouped into network.target, and started as soon as systemd starts network.target

Think of it like the runlevels in SysV-init, a daemon must be inserted into a runlevel, otherwise... when should it start?

A safe default is to set "WantedBy=multi-user.target", it's the last one that's started.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .