(UPDATE 2: there’s also a systemd module now, which should provide a neater wrapper round these commands. Explicit daemon-reload is still required)
(UPDATE: there is now a PR open to add this functionality)
We recently migrated to Debian 8 which, by default, uses systemd. I can appreciate why some people have misgivings about it, but from my point of view it’s been a massive improvement.
Our unit files look like this now:
[Service]
ExecStart=/var/www/{{ app_name }}/app.js
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier={{ app_name }}
User={{ app_name }}
Group={{ app_name }}
Environment=NODE_ENV={{ env }}
WorkingDirectory=/var/www/{{ app_name }}
[Install]
WantedBy=multi-user.target
Compared to a 3 page init script, using start-stop-daemon. And we no longer need a watchdog like monit.
We do our deployments using ansible, which already knows how to play nice with systemd. One thing missing though, is that if you change a unit file you need to call systemctl daemon-reload before the changes will be picked up.
There’s a discussion underway as to whether ansible should take care of it. But for now, the easiest thing to do is add another handler:
- name: Install unit file
sudo: true
copy: src=foo.service dest=/lib/systemd/system/ owner=root mode=644
notify:
- reload systemd
- restart foo
with a handler like this:
- name: reload systemd sudo: yes command: systemctl daemon-reload
UPDATE: if you need to restart the service later in the same play, you can flush the handlers to ensure daemon-reload has been called:
- meta: flush_handlers