How To Create a systemd Service in Linux (CentOS 7)

By | 2014/12/08

Creating a systemd service in Linux is much easier than writing init scripts. Here is an example to create an iperf3 service for systemd!


OS used in this guide: CentOS 7 with EPEL for the iperf3 package


1. First, install iperf3.
$ sudo yum install iperf3

2. Next, create a user iperf which will be used to run the iperf3 service.
$ sudo adduser iperf -s /sbin/nologin

3. Next, create the following file:
/etc/systemd/system/iperf3.service

Put in the following contents and save the file:
[Unit]
Description=iperf3 Service
After=network.target

[Service]
Type=simple
User=iperf
ExecStart=/usr/bin/iperf3 -s
Restart=on-abort


[Install]
WantedBy=multi-user.target


Reload systemd to see the changes
$ sudo systemctl daemon-reload

Start the iperf3 service:
$ sudo systemctl start iperf3

Check the status:
[stmiller@ny ~]$ sudo systemctl status iperf3
iperf3.service - iperf3 Service
   Loaded: loaded (/etc/systemd/system/iperf3.service; disabled)
   Active: active (running) since Mon 2014-12-08 13:43:49 EST; 18s ago
 Main PID: 32657 (iperf3)
   CGroup: /system.slice/iperf3.service
           └─32657 /usr/bin/iperf3 -s

Dec 08 13:43:49 ny.stmiller.org systemd[1]: Started iperf3 Service.
[stmiller@ny ~]$ 

Stop the iperf3 service:
$ sudo systemctl stop iperf3

Start the service at boot:
[stmiller@ny ~]$ sudo systemctl enable iperf3
ln -s '/etc/systemd/system/iperf3.service' '/etc/systemd/system/multi-user.target.wants/iperf3.service'

Disable the service at boot:
$ sudo systemctl disable iperf3

More resources:
arch wiki
systemd homepage

10 thoughts on “How To Create a systemd Service in Linux (CentOS 7)

  1. Kevin Sproule

    Thanks for the informative post. I must say however that SystemD has the stench of Windows about it and and I am not in favor of turning Linux into Windows.

    Reply
  2. Mark

    Thank you, this helps me to find my way into the world of systemd after a lifetime of init.

    I have found however, that in CentOS 7, all of the scripts have been stored in separate directories under /etc/systemd/system. In those directories, everything is a symlink to /usr/lib/systemd/system/… in a lot of other different directories.

    Why in the world the CentOS folks have made this so complex is beyond me.
    Can I still add my own startup script directly into /etc/systemd/system without consequences?

    Reply
    1. Martin

      Hi Mark,

      Did you find out how to create systemd services in CentOS 7? I’ve tried using a command that I was recommended to use, chkconfig –add application, but it doesn’t seem to do the trick. Also I’ve used systemctl enable application.service, which presumably does the same thing as the chkconfig command, but this also doesn’t seem to do the trick. Them CentOS folks…

      Reply
      1. Hussain

        Martin

        No, these are two different, incompatible methods. In the old method, you created a file in a different format and used “service xxx start/stop” to start/stop the service and “chkconfig -add/-delete/etc” to enable autostart.

        Look in the documentation for the systemctl method which is now used. This blog post shows how to create the service file and then use “systemctl start/stop xxx” to start/stop it. In this format, you use “systemctl enable xxx” to mark it for autostart.

        Reply
  3. Hussain

    Could you kindly explain the script? e.g. what is the function of ExecStart? To me it looks as if it means “the script to call to start the service”. If so, shouldn’t there be a matching ExecStop?

    What is “After=network.target”? If this means that this service should start after the network service has started, then should it not be “After=network.service”?

    What is the function of “User=…”? Will it automatically su – before calling the start script or should that be done within the script that is called?

    Reply
  4. Tom

    Very good simple write up.. Thank you for your efforts

    Reply
    1. Tom

      PS.. Liked your SystemD pic.. Made me stop and laugh for a second .. Its always good to be able to laugh while at work ..

      Reply
  5. txusff

    useradd or adduser?

    sudo adduser iperf -s /sbin/nologin
    Option s is ambiguous (shell, system)

    Reply
  6. Dennis

    You forgot to set permissions on your script. Everything in this folder is executable.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.