2016/09/23

systemd unit file names

TL;DR: custom systemd unit files can not have "-" in their name, or at least mine can't.

I like to have third-party software installed in a version-specific directory.  In particular, I'm trying to get Elasticsearch to live in /opt/elasticsearch-2.4.0/ with a symlink /opt/elasticsearch -> /opt/elasticsearch-2.4.0, especially for service software that I might need to run multiple versions.  I'm using Ubuntu 16.04 (Xenial/LTS) so I'm forced to deal with systemd files that are not delivered OOTTB.  For comparison, I can install the .deb that elastic.co distributes, but that installs itself in /usr/, which means only one version.

Fortunately, the unit file is very simple:

[Unit]
Description=Elasticsearch 2.4.0
Documentation=http://www.elastic.co
Wants=network-online.target
After=network-online.target

[Service]
Environment=ES_HOME=/opt/elasticsearch-2.4.0
Environment=CONF_DIR=/opt/elasticsearch-2.4.0/config
Environment=DATA_DIR=/var/lib/elasticsearch
Environment=LOG_DIR=/var/log/elasticsearch
Environment=PID_DIR=/var/run/elasticsearch
EnvironmentFile=-/etc/default/elasticsearch-2.4.0

WorkingDirectory=/usr/share/elasticsearch

User=elasticsearch
Group=elasticsearch
ExecStart=/opt/elasticsearch-2.4.0/bin/elasticsearch

I save this as /usr/lib/systemd/system/elasticsearch-2.4.0.service, and... nothing happens.  Install the .deb, check that it has the right unit files (starts service ok).  copy /usr/lib/systemd/system/elasticsearch.service as elasticsearch-2.4.0.service -- This should use the exact same config options, just run with a different service name, and nothing.  Purge the .deb and put my unit file (above) in elasticsearch.service, and it runs.

The closest I can come to documentation of why servicename -dash- something is in the man page:
Some unit names reflect paths existing in the file system namespace.  Example: a device unit dev-sda.device [...]
 So there might be something special about unit names with a dash in them?  Hmm, mv elasticsearch.service elasticsearch_2.4.0.service ; systemctl daemon-reload ; service elasticsearch_2.4.0 start.  By golly, that works.

I guess I'll change the service naming.  (But note, cfengine3-web is apparently a perfectly valid systemd unit name for CFEngine Enterprise)