Skip to content

holesch/sdnotify-wrapper-py

Repository files navigation

sdnotify-wrapper-py

This project provides a command line tool sdnotify-wrapper, that can be used to send a readiness notification from a service to systemd, by simply writing a newline to stdout. This can be an alternative to sd_notify(3) or systemd-notify(1), if you don't want your service to depend on systemd.

Installation

There's a package published on PyPi, so it can be installed either with pip, or globally with pipx:

$ sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx install sdnotify-wrapper-py

Usage

In your service write one line to stdout whenever the service is ready (make sure to write logs to stderr instead). For example in Python (characters other than a newline are ignored):

print("ready", flush=True)

Or in C:

write(1, "\n", 1)

Then create a systemd service file with Type=notify, e.g. if your service would be started with my-service --foo bar:

[Unit]
Description=My Service

[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/local/bin/sdnotify-wrapper my-service --foo bar

[Install]
WantedBy=multi-user.target

sdnotify-wrapper will then connect to the stdout of your service, notify systemd when it reads a newline and exit.

Why Python?

sdnotify-wrapper is a tool originally written by Laurent Bercot: sdnotify-wrapper.c. Unfortunately this tool is not packaged for any of the major Linux distributions, so it's not a great user experience if your service requires this mechanism.

I chose to reimplement this tool in Python mainly, because it's easier to install it with a Python package manager. In doing this, I hope this readiness notification mechanism will be adopted by more projects and the original tool will be packaged by more distributions.

About

Simplify systemd ready notifications for services

Topics

Resources

License

Stars

Watchers

Forks