Systemd Run - Systemd Transient Units

Introduction

systemd is a controversial topic amongst Linux enthusiast, some like it, some hate it. I understand why people dislike systemd but for me personally, systemd has served me well, I still use systemd (arch BTW). Benno Rice has an excellent talk on The Tragedy of systemd that summarizes my attitude towards systemd.

It is a complex piece of software and I still learn new things about systemd every now and then. One such thing I learned recently was systemd-run.

systemd-run offers an excellent way to spawn transient systemd units. You can use a single command to spawn up a systemd unit and interact with it just like how you would with a normal systemd unit

This can be useful if elements of the process managed by a systemd unit varies with each run.

The requirement that led me to the discovery of systemd-run is managing multiple VPN connections. I have a bunch of OpenVPN configuration files stored on the filesystem. I do not want to write systemd service unit files for each and every OpenVPN configuration. This is the script that I came up with that utilizes systemd-run & fzf to solve this problem.

VPN_CONFIG_FILE=$(ls *.ovpn | fzf)

sudo systemd-run \
   --unit=vpn-connection \                      # name of the transient systemd unit
   --property=WorkingDirectory=$(pwd) \         # additional properties to be set on the systemd unit
   /usr/bin/openvpn --config $VPN_CONFIG_FILE   # ExecStart 

since running OpenVPN requires root permissions, I am creating a systemd unit using sudo. you could even use systemd-run using the --user flag to run processes that do not require root. For running the python HTTP server to serve the contents of a directory, I could use this command.

systemd-run --user --unit=fileserver /usr/bin/python -m http.server 

if a systemd-run unit fails, you just need to run systemctl reset-failed to reset the service and reinitialize this service.