## Simple Systemd service for monitor auto-configuration

June 25, 2017

I like to experiment with my laptop testing different combinations of operating systems and desktop managers but it has been a while my systems are quite stable running Xubuntu + i3. Despite I like the minimalistic simplicity of i3, sometimes it requires some kind of hacks to do stuff usually straightforward in other more user-friendly systems. This post is about a background utility auto-configuring monitor devices connected to my Xubuntu platform.

To configure the monitors I wrote a simple bash script but I took the chance to integrate it in the new Systemd Ubuntu service manager.

### Systemd

Systemd (and its main command systemctl) works with units. A unit any of the system object of interest:

• a service
• a device
• a mount
• a target

All the units share some common properties and methods and each of them can have specific methods. Each unit is described by a text file named:

<unit_name>.<unit_type>


Targets are special unit files which represent system checkpoints, something similar to the old-fashioned run_levels. Target units are used to group the other units. Given a speicific target unit, a generic unit can specify that:

• it is part of a it (WantedBy)
• it needs it as a pre-condition (Wants)

On start-up the computer will go through all the pre-requisite cascade and reach the default target (which is generally called multi_user.target on a server and graphical.target on a desktop). In any case, Systemd developers are smart enough to expose a default.target which is a symlink to the current default target unit.

### System or user services

Systemd differentiates between system services and user services; the latters have less privilegies (hence are safer) and can be enabled by a subset of the entire system users. Technically, the only difference between the two kind of services is the installation folder.

On *buntu, system services are located in /etc/systemd/system while the user services in /etc/systemd/user.

I chose the user option and I bundled my script using an on-the-fly buildeb script.

Note that user services must be enabled manually by the users with:

$> systemctl --user enable <service_name>.service  ### XWizard Our little service should start with the reaching of the default target and we can add a dependency on the multi-user target as it is a user service so it is run only by user sessions. Here it is the service unit file: [Unit] Description=XWizard automatically configure available monitors using xrandr Wants=multi-user.target [Service] TimeoutStartSec=1 ExecStart=/usr/bin/xwizard [Install] WantedBy=default.target  To install it on a *buntu system, just type: $> git clone https://github.com/lucabaldesi/XWizard
$> ./xwizard.buildeb #> dpkg -i XWizard.deb$> systemctl --user enable xwizard.service