Managing services¶
Aside from using batou’s general purpose functions for creating files and running commands we have a few ready-to-use abilities for higher level service management.
Supervisor (TODO)¶
Our built-in supervisor component allows you to run a supervisor process within your service user and has a simple API for declaring components that want to integrate with the supervisor config.
The supervisor itself will be integrated into the system’s startup automatically, depending on your platform.
SystemD¶
Note
SystemD is a non-core component provided through the batou_ext package.
Alternatively to using Supervisor you can register each program as a system-wide service managed by SystemD. You can also specify custom configuration in addition to (or overriding) the defaults:
from batou.component import Component
from batou.lib.file import File
from batou.lib.service import Service
import batou_ext.nix
class Tick(Component):
def configure(self):
self += File('tick.sh', mode="rwxr-xr-x")
self += Service('tick.sh',
systemd=dict(Type='simple',
Unit_After='cron.service memcached.service',
Service_RestartSec=11))
You should import the batou_ext.nix module to register the Platform specific Service component.
This will result in the following unit file:
[Service]
Environment="LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive"
Environment=PATH=/home/ctheune/bin:/var/setuid-wrappers:/home/ctheune/.nix-profile/bin:/home/ctheune/.nix-profile/sbin:/home/ctheune/.nix-profile/lib/kde4/libexec:/nix/var/nix/profiles/default/bin:/nix/var/nix/profiles/default/sbin:/nix/var/nix/profiles/default/lib/kde4/libexec:/run/current-system/sw/bin:/run/current-system/sw/sbin:/run/current-system/sw/lib/kde4/libexec
Environment="TZDIR=/etc/zoneinfo"
ExecStart=/home/ctheune/deployment/work/tick/foobar.sh start
Group=service
LimitNOFILE=64000
LimitNPROC=64173
LimitSIGPENDING=64173
RestartSec=11
Type=simple
User=ctheune
Restart=always
[Unit]
After=cron.service memcached.service
If you want to leverage SystemD’s ability to repeat a key in the configuration (like using multiple ExecStart statements) then you can simply pass that key as a list. This will be automatically expanded into multiple lines:
systemd=dict(Type='simple',
ExecStart=['command1', 'command2'])
[Service]
...
ExecStart=/home/ctheune/deployment/work/tick/command1
ExecStart=/home/ctheune/deployment/work/tick/command2
...
Note
The SystemD support is currently geared towards the NixOS-based environment provided by us on our Flying Circus platform. We’re happy to extend and generalise this module upon request.