Sling Academy
Home/DevOps/Ubuntu: How to create a custom systemd service

Ubuntu: How to create a custom systemd service

Last updated: January 28, 2024

Introduction

Systemd is a system and service manager for Linux operating systems that introduces the concept of systemd units to manage different resources of the system. Creating a custom systemd service in Ubuntu enables users to start, stop, and manage custom background processes effectively. This tutorial covers the process of creating a custom systemd service on Ubuntu, from basic to advanced use cases.

Understanding systemd

Before jumping into creating a custom service, it’s essential to understand what systemd is and how it works. systemd provides a standard process for managing what programs run when a Linux system boots up and supervises them throughout the system’s lifecycle.

Basic Components of systemd

  • Unit file: This is a configuration file for systemd that describes a service, a mount point, a socket, etc.
  • Service unit: A specific type of unit file that describes how to manage a service or application.

Creating a Basic systemd Service

Let’s start by creating a simple systemd service.

Step 1: Write a Script

First, create a script that you want to manage as a service. Let’s say /usr/local/bin/my_script.sh. Make sure it’s executable:

#!/bin/bash
# My custom script
echo "Hello, World!"

Make the script executable with:

chmod +x /usr/local/bin/my_script.sh

Step 2: Create a Service Unit File

Create a new unit file at /etc/systemd/system/my_service.service with the following content:

[Unit]
Description=My Custom Service

[Service]
Type=simple
ExecStart=/usr/local/bin/my_script.sh

[Install]
WantedBy=multi-user.target

Here, we specify our script as the ExecStart command, which systemd will call when starting the service.

Step 3: Manage the Service

To enable and start the service, use the following commands:

systemctl daemon-reload
systemctl enable my_service
systemctl start my_service

Check the status of the service with:

systemctl status my_service

The output will show you the status of your new systemd service.

Managing Service Execution

In this section, we’ll discuss how to manage the environment and user privileges for your service.

Setting Environment Variables

You can set environmental variables directly in your service file:

[Service]
Environment="VAR1=value1" "VAR2=value2"
ExecStart=/usr/local/bin/my_script.sh

Running as a Non-root User

To run the service as a non-root user, specify this in the service file:

[Service]
User=myuser
Group=mygroup
ExecStart=/usr/local/bin/my_script.sh

Advanced Usage

Let’s dive into some advanced configuration options.

Setting Up a Timer

To execute a service based on a timer, first create a timer unit my_service.timer with content like:

[Unit]
Description=Runs my_service every hour

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

Then, enable and start the timer:

systemctl enable my_service.timer
systemctl start my_service.timer

Restart Policies

In your service file, you can define behavior if the service exits unexpectedly:

[Service]
Type=simple
ExecStart=/usr/local/bin/my_script.sh
Restart=on-failure
RestartSec=5s

This will restart your service after 5 seconds if it fails.

Securing Services

Security is a crucial aspect, especially for services exposed to the network. systemd provides options to tighten up security.

PrivateTmp

Isolates /tmp and /var/tmp directories for the service:

[Service]
PrivateTmp=true
ExecStart=/usr/local/bin/my_script.sh

System Call Filtering

Filter what system calls the service can execute:

[Service]
SystemCallFilter= @system-service
ExecStart=/usr/local/bin/my_script.sh

Troubleshooting and Maintenance

As with any system component, you may encounter issues that need troubleshooting.

Viewing Logs

Use journalctl to view service logs:

journalctl -u my_service.service

Reloading the Service

To apply changes without restarting:

systemctl daemon-reload
systemctl restart my_service

Conclusion

Creating a custom systemd service on Ubuntu can help you manage applications and processes effectively. Systemd’s extensive features offer fine control over service behavior, allowing for automated and secure management throughout your system’s lifecycle.

Next Article: Ubuntu: How to create a cron job (that runs repeatedly at a set interval)

Previous Article: How to take a snapshot of a disk in VirtualBox (and restore it later)

Series: Linux Tutorials

DevOps

You May Also Like

  • How to reset Ubuntu to factory settings (4 approaches)
  • Making GET requests with cURL: A practical guide (with examples)
  • Git: What is .DS_Store and should you ignore it?
  • NGINX underscores_in_headers: Explained with examples
  • How to use Jenkins CI with private GitHub repositories
  • Terraform: Understanding State and State Files (with Examples)
  • SHA1, SHA256, and SHA512 in Terraform: A Practical Guide
  • CSRF Protection in Jenkins: An In-depth Guide (with examples)
  • Terraform: How to Merge 2 Maps
  • Terraform: How to extract filename/extension from a path
  • JSON encoding/decoding in Terraform: Explained with examples
  • Sorting Lists in Terraform: A Practical Guide
  • Terraform: How to trigger a Lambda function on resource creation
  • How to use Terraform templates
  • Understanding terraform_remote_state data source: Explained with examples
  • Jenkins Authorization: A Practical Guide (with examples)
  • Solving Jenkins Pipeline NotSerializableException: groovy.json.internal.LazyMap
  • Understanding Artifacts in Jenkins: A Practical Guide (with examples)
  • Using Jenkins with AWS EC2 and S3: A Practical Guide