Create systemd.service 2
From: https://www.linode.com/docs/guides/start-service-at-boot/
Published May 1, 2018 by Linode
Use systemd to Start a Linux Service at Boot
Create a Linode account to try this guide with a $100 credit.
This credit will be applied to any valid services used during your first 60
days.
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
- Create a script or executable that the service will manage.
This guide uses a simple Bash script as an example:
File: test_service.sh
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.
- 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
- 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.
- 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
- Once you have a unit file, you are ready to test the service:
sudo systemctl start myservice
- 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...
- The service can be stopped or restarted using standard systemd commands:
sudo systemctl stop myservice
sudo systemctl restart myservice
- 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.
- 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...
For more information about using systemctl commands, see the systemctl guide.
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 info=/tmp/myservice-systemd-cat-pipe-info
2 mkfifo "$info"
3 trap "exec 3>&-; rm $info" EXIT
4 systemd-cat -p info < "$info" &
5 exec 3>"$info"
7 DATE=`date '+%Y-%m-%d %H:%M:%S'`
8 echo "Example service started at ${DATE}" > "$info"
9
10 while :
11 do
12 echo "Looping...";
13 sleep 30;
14 done
More Information
You may wish to consult the following resources for additional information
on this topic. While these are provided in the hope that they will be
useful, please note that we cannot vouch for the accuracy or timeliness of
externally hosted materials.