How to Create and Run New Service Units in Systemd Using Shell Script

A few days ago, I came across a Centos 8 32-bit distro and I felt the desire to test it on an old 32-bit machine. After booting I realized that it had a bug and it was losing the network connection, which I had to turn “up” manually every time after boot. So, the question was how could I set a script doing this job, running every time I boot my machine?

Well, this is very simple and I’ll show you the system way using service units. But first a small introduction to service units.

In this article, I’m going to explain what a “service unit” in systemd is, and how easy is to create and run one. I will try to simplify what “targets” are, why we call them “collections of units” and what are their “wants”. Finally, we are taking advantage of a service unit to run our own script after the boot procedure.

It’s obvious that your computer is useful due to the services it offers and in order to have this functionality, many services have to be called as the computer boots and reaches different levels.

Other services are called to be executed when the computer reaches, for example, the rescue level (runlevel 0) and others when it reaches the multi-user level (runlevel 3). You can imagine these levels as targets.

In a simple way, target is a collection of service units. If you want to have a look at service units running in your level, type:

# systemctl --type=service
List All Service Units in CentOS 7
List All Service Units in CentOS 7

As you can see some services are active and “running” all the time, while others run one-time and terminate (exited).

If you want to check the status of a service, you can use systemctl command as shown.

# systemctl status firewalld.service
Check Status of Service in CentOS 7
Check the Status of Service in CentOS 7

As you can see I checked the status of firewalld.service (tip: you can use the auto-complete for the name of the service). It informs me that firewalld service is running all the time and it is enabled.

Enabled and disabled means the service will be permanently loaded or not, during the next boot respectively. On the other hand, to start and stop a service has the limitation of the present session and it’s not permanent.

For example, if you type:

# systemctl stop firewalld.service
# systemctl status firewalld.service
Manage Services in CentOS 7
Manage Services in CentOS 7

You can see that the firewalld.service is inactive (dead) but it is still enabled, which means that during the next boot it will be loaded. So if we want a service to be loaded during boot time in the future we must enable it. What a great conclusion! Let’s create one, it’s easy.

If you go to the folder:

# cd /etc/systemd/system
# ls -l
SystemD System Files
SystemD System Files

You can see some link files of unit services and some directories of the “wants” of a target. For example, what the multi-user target wants to be loaded when the boot procedure reaches its level, is listed in the directory with name /etc/systemd/system/

# ls
Multi User Targets Services
Multi-User Targets Services

As you can see it doesn’t contain only services but also other targets which are also collections of services.

Let’s make a service unit with the name connection.service.

# vim connection.service

and type the following (hit “i” for insert mode), save it, and exit (with “esc” and “:wq!” ) :

Description = making network connection up
After =

ExecStart = /root/scripts/

WantedBy =
Create New Service Units in CentOS 7
Create New Service Units in CentOS 7

To explain the above: we have created a unit of service type (you can also create units of target type), and we have set it to be loaded after the (you can understand that the booting procedure reaches the targets with a defined order) and we want every time the service starts to execute a bash script with the name which we are going to create.

The fun starts with the last part [install]. It tells that it will be wanted by “”. So if we enable our service a symbolic link to that service will be created inside the folder! Got it? And if we disable it that link will be deleted. So simple.

Just enable it and check:

# systemctl enable connection.service

It informs us that the symbolic link in the folder has been created. You can confirm by running ls command as shown.

# ls
Enable Service in CentOS
Enable Service in CentOS

As you can see “connection.service” is ready for the next booting, but we must create the script file first.

# cd /root
# mkdir scripts
# cd scripts
# vim

Add the following line inside Vim and save it:

nmcli connection up enp0s3

The nmcli command to bring up the network connection for the enp0s3 interface.

Of course, if you want your script to execute something else, you could type whatever you want instead of the second line.

For example,

touch /tmp/testbootfile

that would create a file inside /tmp folder (just to check that your service is working).

We must also make the script executable by running chmod command as shown.

# chmod +x

Now we are ready. If you don’t want to wait until the next boot (it’s already enabled) we can start the service for the current session by typing:

# systemctl start connection.service

Voila! My connection is up and running!

If you’ve chosen to write the command “touch /tmp/testbootfile” inside the script, just to check its functionality, you will see this file created inside /tmp folder.

Confirm Service Status
Confirm Service Status

I really hope to help you figure out what services, wants, targets, and running scripts during booting is all about.

Ioannis Koustoudis
Ioannis Koustoudis is a LFCS­ Linux sysadmin from Kavala, Greece. He works for the ministry of education and supports almost 200 school units in their infrastructure. If he is not in front of a computer screen, he plays music (he is a multi­-instrumentalist) or take care of his two lovely kids.

Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.

Join the TecMint Weekly Newsletter (More Than 156,129 Linux Enthusiasts Have Subscribed)
Was this article helpful? Please add a comment or buy me a coffee to show your appreciation.

20 thoughts on “How to Create and Run New Service Units in Systemd Using Shell Script”

  1. When I run systemctl start I get the following error message:

    Changed on disk. Run systemctl daemon-reload to reload units.

    Then when I run a systemctl status the output on the active line says:


    my.service file entials

    Description = connecting private node to master
    ExecStart = /bin/bash /usr/lib/systemd/system/
    WantedBy =
  2. I have to agree, this article was very clear in explaining things about Linux services like wants and targets. I see a few comments about things that aren’t exactly right, but the basics are so well explained. I’d love to see a follow-up article that went into those topics in more detail.


Got something to say? Join the discussion.

Thank you for taking the time to share your thoughts with us. We appreciate your decision to leave a comment and value your contribution to the discussion. It's important to note that we moderate all comments in accordance with our comment policy to ensure a respectful and constructive conversation.

Rest assured that your email address will remain private and will not be published or shared with anyone. We prioritize the privacy and security of our users.