Author's Picture
Author: Joel Gray Published: 27 September 2022 Read Time: ~5 minutes

Run Anything as a Service on Linux

Do you have a home Minecraft server that you shuts down every time your SSH session disconnects? Or do you have some custom python scripts you want to run all the time?

Let’s learn about systemctl services…

The following command will show you all the current services that are running along with a brief description of what their purpose is.

$ sudo systemctl list-units
List Services Output

The image above is an example of that output of the ‘list-units’ command, we can see universal kernel services as well as some common services for web servers such as ‘apache2.service’. You can even see custom services like my twitter bot service ‘fuelBotTwitter.service’ at the very bottom.

I’m going to show you how to set up your own service like this!

But first, a few handy commands!

Check the status of a service

I’m going to show you some useful commands that you’ll need to know and apply them to my apache2 service, which is actually the service hosting this very website. First lets check the status of this service.

$ sudo systemctl status apache2.service
Show service status

The image above is typically what you’ll see when you check the status of a service, it’ll tell you if the service is active, some stats on the job and also a brief logging history at the bottom. All very handy.

Restart a service

If you’re having issues with a service or have made changes to it’s configuration since you last started the service, you can use the restart service command below. If you don’t get any output from the command it means the service has been restarted successfully.

$ sudo systemctl restart apache2.service

View running logs of a service

But what happens if your service doesn’t restart correctly? How do I know what’s wrong? That’s where the journalctl command comes in! The command below using the -u flag to specify what unit or service we wish to view logs for and specifies the -f flag to follow the log in real time to view any error logs that may be coming through.

$ sudo journalctl -u apache2.service -f

View all logs of a service

But you may want to view logs in the past. You can do this by viewing all logs for that service by just leaving out the -f flag. Although this often spits out far too much data for us.

$ sudo journalctl -u apache2.service

View recent logs of a service

So what we can do is specify how far back in the logs we want to look – the command a fairly self explanatory here.

$ sudo journalctl -u apache2.service --since "1 hour ago"

OR

$ sudo journalctl -u apache2.service --since "10 minutes ago"

Enable/Start a service

If you’ve just created a new service and wish to be able to use it, you need to first enable the service and then start the service. This can be done with these commands: (We’re still using apache2 as an example it can be any service)

$ sudo systemctl enable apache2.service

OR

$ sudo systemctl start apache2.service

Disable/Stop a service

Finally, if you wish to stop a service or permanently disable a service you can do so which the following commands:

$ sudo systemctl stop apache2.service

OR

$ sudo systemctl disable apache2.service

Creating Your Own Custom Linux Service

Firstly you need some sort of script, program, process or server you wish to running constantly as a service. I’m going to show you how I set my python twitter bot program as a linux service using systemctl.

Create your service config file

Go to the correct directory for storing service config files and create a new file with the name of your service/app as the same and suffix the file with ‘.service’. Example below:

$ cd /etc/systemd/system
$ nano service-name.service

Next we need to include the relevant information that systemctl/systemd needs to interpret our service and be able to run it correctly. Here is an example of my python twitter bot service config file. Note here that I’m using a python virtual environment as my executor, you can use your name system python install or even things like bash instead!

Below is the contents of my twitterBot.service file. Change the ExecStart paths to your interpreter and programs to suit your needs and then save the file. To save and close the file, press Ctrl+x then type ‘y’ and press enter.

[Unit]
Description=Monitor Service for fuelBotTwitter

[Service]
ExecStart=/home/joel/fuelBotTwitter/twitterBotVenv/bin/python3 /home/joel/fuelBotTwitter/bot.py

Restart=always
EnvironmentFile=/etc/environment

[Install]
WantedBy=multi-user.target


You can do some background reading here, if you wish.

Okay let’s talk a little about the attributes in this file.

Description:Brief description of the service, will show in list-units command
ExecStart:Parameters for starting the service, first is the interpreter/runner and second is the program or script to be run.
Restart:Tell linux you always want to restart the service in the event of a failure, no matter the reason for the service failure
EnvironmentFile: A file where we can specify environment variables for the service, set to /etc/environment by default
WantedBy:Is necessary to be set for your system to enable the service successfully. If you omit this the command ‘systemctl enable myservice.service’ will fail.

Start your service

Now it’s time to start your service using some of the commands we looked at in the first half of this blog.

First we need to reload the systemctl deamon to have it recognise our new myservice.service file.

$ sudo systemctl daemon-reload

Next we need to enable the service to have it start every time we boot

$ sudo systemctl enable myservice.service

Then we want to start the service to have it be operational immediately.

$ sudo systemctl start myservice.service

And finally we want to check the status of the service just to be sure it’s active and running correctly.

$ sudo systemctl status myservice.service

If you have any issues with this you can use the journalctl commands mentioned earlier, check the logs and do some research to try sus it out. If not you can drop me a comment or an email. Hope this helps!

Written by Joel Gray

27/09/2022