1. Overview

Most Linux distributions use systemd as a contemporary service manager. Usually, we need to become root to control the services. However, we can also allow ordinary users to handle services on their own. This method is often called rootless.

In this tutorial, we’ll learn to install, manage and control services on a per-user basis.

2. Creating and Adding a Sample Service

First, let’s write a simple Bash script user_service for the service:

#!/bin/bash

while true
do
    now=$(date)
    me=$(whoami)
    echo "User $me at $now"
    sleep 10
done

So, the script prints the date and user name. Then, we need to copy the script to the /usr/local/bin directory and make sure that the user has executable permission on it.

Next, let’s prepare the service’s unit file user_service.service:

[Unit]
Description=Script Daemon For Test User Services

[Service]
Type=simple
#User=
#Group=
ExecStart=/usr/local/bin/user_service
Restart=on-failure
StandardOutput=file:%h/log_file

[Install]
WantedBy=default.target

Since the entries User and Group are meaningless for user service, we’ve commented them out. Next, we redirect the script’s output to log_file with the StandardOutput entry. It’s worth noting that the %h modifier stands for the user’s home directory.

Now, with the sudo privilege let’s copy the unit file to the /etc/systemd/user directory. In this way, systemd regards the service as the user’s one. Moreover, the service is available for all users.

3. The user Option

We can manage services as regular users with the help of the user option of systemctl. Thus, services can be enabled/disabled, started/stopped, and so on without the sudo privilege.

So, let’s install the service:

$ systemctl --user daemon-reload

Afterwards, let’s start it:

$ systemctl --user start user_service.service

Next, let’s check its status:

$ systemctl --user status user_service.service
● user_service.service - Script Daemon For Test User Services
     Loaded: loaded (/etc/xdg/systemd/user/user_service.service; disabled; vendor preset: enable>
     Active: active (running) since Thu 2023-01-12 19:23:14 CET; 28s ago
   Main PID: 4935 (user_service)
      Tasks: 2 (limit: 18982)
     Memory: 580.0K
        CPU: 16ms
     CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/user_service.service
             ├─4935 /bin/bash /usr/local/bin/user_service
             └─4972 sleep 10

sty 12 19:23:14 ubuntu systemd[1511]: Started Script Daemon For Test User Services.

Again, we should note that we’ve done that all without the sudo command.

4. Enabling, Disabling, and the Service’s Lifetime

Now let’s enable or disable the service with systemctl:

$ systemctl --user enable user_service.service
Created symlink /home/joe/.config/systemd/user/default.target.wants/user_service.service → /etc/xdg/systemd/user/user_service.service.

Thus, once enabled, the service starts automatically after our login. Then, it’ll be running as long as we have some open sessions. In other words, the service instance is bound to the user, not to the session.

Finally, let’s disable it:

$ systemctl --user disable user_service.service

5. Toggling Services of All Users

With the root privilege, we can enable or disable the service for all users with the global option of systemctl:

$ sudo systemctl --global enable user_service.service
Created symlink /etc/systemd/user/default.target.wants/user_service.service → /etc/systemd/user/user_service.service.

Consequently, all users obtain their own running instance of the service immediately after login.

6. Extending Service’s Life

Let’s assume that we intend our service to perform long-running tasks, e.g., calculation. So, we should extend its life beyond the end of the last session. In that case, we use loginctl with the enable-linger command:

$ loginctl enable-linger

Now, our services start right after the system boot and run till the shutdown. We should keep in mind that this applies to all our systemd services. Finally, we can turn it off with disable-linger.

7. Inspecting Service’s Log

Now let’s check the service’s log with the journalctl command. Once again, we’ll use the user option:

$ journalctl --user -u user_service
# ...
Jan 12 19:50:20 ubuntu systemd[1511]: Stopped Script Daemon For Test User Services.
Jan 12 19:50:24 ubuntu systemd[1511]: Started Script Daemon For Test User Services.

8. Conclusion

In this article, we looked at user services managed by systemd.

First, we created a simple service and added it to the systemd using the administrator privilege. Then, we managed the service as a non-sudoer thanks to the user option of systemctl.

Subsequently, we took a look at the lifetime of service and learned how to start the service without login. Finally, we examined the service’s log.

Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.