Recently I was looking for a lightweight user-level service manager. In most Linux distributions these days, systemd is the default. systemd allows you to create user-specific services, but by default you’ll need to start them when you login unless you set up lingering.
My primary desktop computer runs GNU Guix, which comes with GNU Shepherd for managing services. It’s fine and all, but I was sort of looking for a method to start a bunch of processes that isn’t distro specific, and potentially something I could use in other places such as in containers.
Actually, I’m not sure that I was actively searching for this sort of
technology or I just stumbled upon one of jessfraz’s
and noticed the usage. The linked Dockerfile uses runit to run postfix
and syslog together in a docker container. It’s pretty simple–just
create a parent directory with child directories for each process you
want to run, and in the child directory put a
run script that runs
After investigating this a little more, it seems like most of this process supervision stuff originated from djb’s daemontools. Guix packages daemontools, but while I was looking into it, I came across s6. s6 was interesting to me because it looks to be written by an opinionated developer that spent more time comparing the technologies than I could easily find elsewhere.
It was pretty easy to set up. I just created a couple of directories
run scripts in them, then ran
s6-svscan ~/.config/service. Since I’m not running Guix with the
%desktop-services, I needed to manually start
pipewire-media-session for audio to work. Not
to mention running
dbus-run-session sway when starting my desktop
environment so that dbus could hook things up that depended on it