systemctl Use systemd to Start a Linux Service at Boot

What is systemd?

systemd is a Linux system tool initially developed by the Red Hat Linux team. It includes many features, including a bootstrapping system used to start and manage system processes. It is currently the default initialization system on most Linux distributions. Many commonly used software tools, such as SSH and Apache, ship with a systemd service.

It is simple to create a custom systemd service that will run any script or process you choose. Although there are several ways to run a script or start a process when your Linode boots, a custom systemd service makes it easy to start, stop, or restart your script, as well as configure it to start automatically on boot. systemd offers the advantage of using a standardized interface that is consistent across all Linux distributions that support it.

Create a Custom systemd Service

  1. Create a script or executable that the service will manage. This guide uses a simple Bash script as an example:

    File: test_service.sh
    1
    2
    3
    4
    5
    6
    7
    8
    
    DATE=`date '+%Y-%m-%d %H:%M:%S'`
    echo "Example service started at ${DATE}" | systemd-cat -p info
    
    while :
    do
    echo "Looping...";
    sleep 30;
    done

    This script will log the time at which it is initialized, then loop infinitely to keep the service running.

  2. Copy the script to /usr/bin and make it executable:

    sudo cp test_service.sh /usr/bin/test_service.sh
    sudo chmod +x /usr/bin/test_service.sh
    
  3. Create a Unit file to define a systemd service:

    File: /lib/systemd/system/myservice.service
    [Unit]
    Description=Example systemd service.
    
    [Service]
    Type=simple
    ExecStart=/bin/bash /usr/bin/test_service.sh
    
    [Install]
    WantedBy=multi-user.target

    This defines a simple service. The critical part is the ExecStart directive, which specifies the command that will be run to start the service.

  4. Copy the unit file to /etc/systemd/system and give it permissions:

    sudo cp myservice.service /etc/systemd/system/myservice.service
    sudo chmod 644 /etc/systemd/system/myservice.service
    

    For more information about the unit file and its available configuration options, see the systemd documentation.

Start and Enable the Service

  1. Once you have a unit file, you are ready to test the service:

    sudo systemctl start myservice
    
  2. Check the status of the service:

    sudo systemctl status myservice
    

    If the service is running correctly, the output should resemble the following:

      ● myservice.service - Example systemd service.
       Loaded: loaded (/lib/systemd/system/myservice.service; enabled; vendor preset: enabled)
       Active: active (running) since Tue 2018-05-01 18:17:14 UTC; 4s ago
     Main PID: 16266 (bash)
        Tasks: 2
       Memory: 748.0K
          CPU: 4ms
       CGroup: /system.slice/myservice.service
               ├─16266 /bin/bash /usr/bin/test_service.sh
               └─16270 sleep 30
    
    May 01 18:17:14 localhost systemd[1]: Started Example systemd service..
    May 01 18:17:14 localhost cat[16269]: Example service started at 2018-05-01 18:17:14
    May 01 18:17:14 localhost bash[16266]: Looping...
    
  3. The service can be stopped or restarted using standard systemd commands:

    sudo systemctl stop myservice
    sudo systemctl restart myservice
    
  4. Finally, use the enable command to ensure that the service starts whenever the system boots:

    sudo systemctl enable myservice
    
      Created symlink from /etc/systemd/system/multi-user.target.wants/myservice.service to /lib/systemd/system/myservice.service.
    
  5. Reboot your Linode from the Linode Manager and check the status of the service:

    sudo systemctl status myservice
    

    You should see that the service logged its start time immediately after booting:

      ● myservice.service - Example systemd service.
       Loaded: loaded (/usr/lib/systemd/system/myservice.service; enabled; vendor preset: disabled)
       Active: active (running) since Wed 2018-05-02 15:03:07 UTC; 48s ago
     Main PID: 2973 (bash)
       CGroup: /system.slice/myservice.service
               ├─2973 /bin/bash /usr/bin/test_service.sh
               └─3371 sleep 30
    
    May 02 15:03:07 localhost systemd[1]: Started Example systemd service..
    May 02 15:03:07 localhost systemd[1]: Starting Example systemd service....
    May 02 15:03:07 localhost bash[2973]: Looping...
    May 02 15:03:37 localhost bash[2973]: Looping...
    

Troubleshooting

  • “Example service started at …” line does not appear in the output of the status command. The systemd-cat output is not reliable because of a race condition. As a workaround update the test_service.sh file as follows:
    File: test_service.sh
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    info=/tmp/myservice-systemd-cat-pipe-info
    mkfifo "$info"
    trap "exec 3>&-; rm $info" EXIT
    systemd-cat -p info < "$info" &
    exec 3>"$info"
    
    DATE=`date '+%Y-%m-%d %H:%M:%S'`
    echo "Example service started at ${DATE}" | systemd-cat -p info
    
    while :
    do
    echo "Looping...";
    sleep 30;
    done
0 (0)
Article Rating (No Votes)
Rate this article
Attachments
There are no attachments for this article.
Comments
There are no comments for this article. Be the first to post a comment.
Full Name
Email Address
Security Code Security Code
Related Articles RSS Feed
Super Grub2 Disk
Viewed 3056 times since Wed, May 22, 2019
Fałszujemy rozpoznania skanerów #2
Viewed 2706 times since Mon, May 21, 2018
Understanding logrotate utility part 1
Viewed 1479 times since Fri, Nov 30, 2018
OEL 7 – How to disable IPv6 on Oracle Linux 7 – Follow Up
Viewed 9149 times since Wed, Jul 25, 2018
stunnel How To Set Up an SSL Tunnel Using Stunnel on Ubuntu
Viewed 1363 times since Sun, Dec 6, 2020
KONTO SFTP Z CHROOTEM Z UŻYCIEM OPENSSH-SERVER NA CENTOS/RHEL6
Viewed 1550 times since Fri, Nov 30, 2018
Linux Network (TCP) Performance Tuning with Sysctl
Viewed 10820 times since Fri, Aug 3, 2018
YUM CRON Enabling automatic updates in Centos 7 and RHEL 7
Viewed 11653 times since Fri, Oct 26, 2018
LVM: Create a new Logical Volume / Filesystem
Viewed 1856 times since Sat, Jun 2, 2018
Red Hat Cluster Tutorial
Viewed 1820 times since Sun, Jun 3, 2018