Systemd is new service manager for Linux. It’s a replacement for all previous init systems (SysV/SysVinit & Ubuntu’s Upstart) and can manage system startup and services. It starts up and supervises the entire system. In the article we are using centos 7.0 installed with systemd 216 version and the latest version is available for download from freedesktop.org. Since 2015, the majority of Linux distributions have adopted systemd and it is considered a de facto standard. The name systemd adheres to the Unix convention of naming daemons by appending the letter d. It also plays on the term “System D”, which refers to a person’s ability to adapt quickly and improvise to solve problems.
In this article, I will show you how to use systemctl to manage systemd service in Linux.
When working with systemd, it is important to understand the concept of units. Units are the resources systemd knows how to interpret. Units are categorized into 12 types as follows −
For the most part, we will be working with .service as unit targets. It is recommended to do further research on the other types. As only .service units will apply to starting and stopping systemd services.
Each unit is defined in a file located in either −
- /lib/systemd/system − base unit files
- /etc/systemd/system − modified unit files started at run-time
PID 1 is occupied by “systemd” and can be seen from pstree command as well:
Let’s explore what systemd is capable of and what possibilities we have with the new replacement for sysVinit.
1) Faster startup
The sysvinit starts the processes serially, one at a time. Systemd starts services in parallel and starts only those services which are actually required, reducing the boot time significantly.
You can get the boot process duration with the following command:
The command systemd-analyze time also shows the same information.
If you want to print a list of all running units, the blame option to systemd-analyze command can provide you with that, ordered by the time taken to initialize.
The above screen shows only a small number of processes, you can scroll through the list with arrows just like in less pager.
2) systemctl command
The systemctl command is the most talked command that comes with systemd. You can manage a whole lot of your system with this command. Let’s explore this command before going any further:
systemctl command without any option lists all the running units. The list-units switch also does the same.
Listing failed units
The failed units can be listed with –failed switch.
You will see the use of systemctl command at many places in this article.
3) Managing services
Let us now see how services can be managed with systemd.
All the active services can be checked with the following command:
systemctl list-units -t service
In the sysvinit, we could use the “service” command to manage the services, but with systemd, the systemctl command is used to manage services. In ordwer to see whether a service is running or not, we can use the systemctl command like this:
systemctl status dnsmasq
Start a service
To start a service, again we use the systemctl command as:
systemctl start dnsmasq
As opposed to service command, this command does not give any output. But of course, we can check the status of the service once again to confirm that its started successfully:
Stopping a service
Now you are smart enough and already know the command to stop a service with systemd:
systemctl stop dnsmasq
Restart a service
Similarly, restarting a service is managed using ‘systemctl restart ‘:
systemctl restart dnsmasq
Reload a service
In case we need to reload the configuration of service (say ssh), without restarting it, we can use the command:
systemctl reload sshd
Although all of the above syntax is working, the official documentation suggests that these command be run with the following syntax:
systemctl status dnsmasq.service
4) Managing services at boot
The chkconfig command was used to manage services at boot. The same command systemd is used with systemd to manage services at boot.
Checking service status at boot
In order to check if a service is enabled on boot or not:
systemctl is-enabled dnsmasq.service
Enable a service at boot
systemctl command can be used like this to enable a service at boot (this corresponds to sysvinit ‘chkconfig on’)
systemctl enable dnsmasq.service
Disable a service at boot
Similarly, the services can be disabled at boot with systemctl command:
systemctl disable dnsmasq.service
5) Managing Remote systems
Typically, all of the above systemctl commands can be used to manage a remote host with systemctl command itself. This will use ssh for communication with the remote host. All you need to do is add the user and host to systemctl command like this:
systemctl status sshd -H [email protected]
6) Managing targets
Systemd has a concept of targets having a similar purpose to runlevels in sysVinit.
The runlevels in sysVinit were mostly numeric (0,1,2,…). Here are the runlevels in sysVinit with their systemd counterparts:
0 runlevel0.target, poweroff.target 1, s, single runlevel1.target, rescue.target 2, 4 runlevel2.target, runlevel4.target, multi-user.target 3 runlevel3.target, multi-user.target 5 runlevel5.target, graphical.target 6 runlevel6.target, reboot.target emergency emergency.target
Changing current target
The current target(runlevel) can be changed with the command:
systemctl isolate graphical.target
List current target
If you want to see what target you are in, you need to list all the corresponding units. It might not feel at home with this new way, but its the way systemd works.
systemctl list-units --type=target
You can see “graphical.target” listed here. This is what we changed our target into. Now let’s change the runlevel again to multi-user.target and then analyze this output:
systemctl isolate multi-user.target # systemctl list-units --type=target
List default target
To list the default target, we use systemctl command like this:
Change default target
The default target can be set with set-default command with systemctl:
systemctl set-default graphical.target
7) Logging in systemd
The systemd has its own logging system called journald. It replaces the syslog daemon from sysVinit. The command journalctl is used to read the logs.
To see all boot messages, run the command “journalctl -b”.
[[email protected] ~]# journalctl -b
The following command follows the system logs in real time (similar to tail -f).
[[email protected] ~]# journalctl -f
Service specific logs
To check logs specific to a particular service or executable, use journalctl like this:
[[email protected] ~]# journalctl /usr/sbin/dnsmasq
8) Power management
The systemctl command can be used to put the system down, or reboot or hibernate.
To poweroff, reboot, suspend and hibernate, use the following commands respectively:
systemctl poweroff # systemctl reboot # systemctl suspend # systemctl reboot
9) Hostnamectl command
The systemd brings out the whole new approach to interacting with your operating system. The systemd is so full of features. For example, you can get the hostname and other useful features about your Linux machine, you can use hostnamectl command
[[email protected] ~]# hostnamectl