Beginners Guide to Managing Services Using systemd
Introduction to systemd
The systemd daemon manages startup for Linux, including service startup and service management in general. It activates system resources, server daemons, and other processes both at boot time and on a running system. Daemons are processes that either wait or run in the background, performing various tasks. Generally, daemons start automatically at boot time and continue to run until shutdown or until they are manually stopped. It is a convention for names of many daemon programs to end in the letter d.
A service in the systemd sense often refers to one or more daemons, but starting or stopping a service may instead make a one-time change to the state of the system, which does not involve leaving a daemon process running afterward (called oneshot). In CentOS/RHEL, the first process that starts (PID 1) is systemd. A few of the features provided by systemd include:
- Parallelization capabilities (starting multiple services simultaneously), which increase the boot speed of a system.
- On-demand starting of daemons without requiring a separate service.
- Automatic service dependency management, which can prevent long timeouts. For example, a network-dependent service will not attempt to start up until the network is available.
- A method of tracking related processes together by using Linux control groups.
Describing Service Units
systemd uses units to manage different types of objects. Some common unit types are listed below:
- Service units have a .service extension and represent system services. This type of unit is used to start frequently accessed daemons, such as a web server.
- Socket units have a .socket extension and represent inter-process communication (IPC) sockets that systemd should monitor. If a client connects to the socket, systemd will start a daemon and pass the connection to it. Socket units are used to delay the start of a service at boot time and to start less frequently used services on demand.
- Path units have a .path extension and are used to delay the activation of a service until a specific file system change occurs. This is commonly used for services which use spool directories such as a printing system.
The systemctl command is used to manage units. For example, display available unit types with the systemctl -t help command.
Listing Service Units
You use the systemctl command to explore the current state of the system. For example, the following command lists all currently loaded service units, paginating the output using less.
[root@host ~]# systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server crond.
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message
...output omitted...
The above output limits the type of unit listed to service units with the –type=service option. The output has the following columns:
Columns in the systemctl list-units Command Output
- UNIT - The service unit name.
- LOAD - Whether systemd properly parsed the unit’s configuration and loaded the unit into memory.
- ACTIVE - The high-level activation state of the unit. This information indicates whether the unit has started successfully or not.
- SUB - The low-level activation state of the unit. This information indicates more detailed information about the unit. The information varies based on unit type, state, and how the unit is executed.
- DESCRIPTION - The short description of the unit.
By default, the systemctl list-units –type=service command lists only the service units with active activation states. The –all option lists all service units regardless of the activation states. Use the –state= option to filter by the values in the LOAD, ACTIVE, or SUB fields.
[root@host ~]# systemctl list-units --type=service --all
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing ...
auth-rpcgss-module.service loaded inactive dead Kernel Module ...
chronyd.service loaded active running NTP client/server
cpupower.service loaded inactive dead Configure CPU power ...
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
● display-manager.service not-found inactive dead display-manager.service
...output omitted...
The systemctl command without any arguments lists units that are both loaded and active.
[root@host ~]# systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary...
sys-devices-....device loaded active plugged Virtio network...
sys-subsystem-net-devices-ens3.device loaded active plugged Virtio network...
...
-.mount loaded active mounted Root Mount
boot.mount loaded active mounted /boot
...
systemd-ask-password-plymouth.path loaded active waiting Forward Password...
systemd-ask-password-wall.path loaded active waiting Forward Password...
init.scope loaded active running System and Servi...
session-1.scope loaded active running Session 1 of...
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing...
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
...output omitted...
The systemctl list-units command displays units that the systemd service attempts to parse and load into memory; it does not display installed, but not enabled, services. To see the state of all unit files installed, use the systemctl list-unit-files command. For example:
[root@host ~]# systemctl list-unit-files --type=service
UNIT FILE STATE
arp-ethers.service disabled
atd.service enabled
auditd.service enabled
auth-rpcgss-module.service static
[email protected] enabled
blk-availability.service disabled
...output omitted...
In the output of the systemctl list-units-files command, valid entries for the STATE field are enabled, disabled, static, and masked.
Viewing Service States
View the status of a specific unit with systemctl status name.type. If the unit type is not provided, systemctl will show the status of a service unit, if one exists.
[root@host ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset:
enabled)
Active: active (running) since Thu 2019-02-14 12:07:45 IST; 7h ago
Main PID: 1073 (sshd)
CGroup: /system.slice/sshd.service
└─1073 /usr/sbin/sshd -D ...
Feb 14 11:51:39 host.example.com systemd[1]: Started OpenSSH server daemon.
Feb 14 11:51:39 host.example.com sshd[1073]: Could not load host key: /et...y
Feb 14 11:51:39 host.example.com sshd[1073]: Server listening on 0.0.0.0 ....
Feb 14 11:51:39 host.example.com sshd[1073]: Server listening on :: port 22.
Feb 14 11:53:21 host.example.com sshd[1270]: error: Could not load host k...y
Feb 14 11:53:22 host.example.com sshd[1270]: Accepted password for root f...2
...output omitted...
This command displays the current status of the service. The meaning of the fields are:
FIELD | DESCRIPTION |
---|---|
Loaded | Whether the service unit is loaded into memory. |
Active | Whether the service unit is running and if so, how long it has been running. |
Main PID | The main process ID of the service, including the command name. |
Status | Additional information about the service. |
Several keywords indicating the state of the service can be found in the status output:
KEYWORD | DESCRIPTION |
---|---|
loaded | Unit configuration file has been processed. |
active (running) | Running with one or more continuing processes. |
active (exited) | Successfully completed a one-time configuration. |
active (waiting) | Running but waiting for an event. |
inactive | Not running. |
enabled | Is started at boot time. |
disabled | Is not set to be started at boot time. |
static | Cannot be enabled, but may be started by an enabled unit automatically. |
Verifying the Status of a Service
The systemctl command provides methods for verifying the specific states of a service. For example, use the following command to verify that the a service unit is currently active (running):
[root@host ~]# systemctl is-active sshd.service
active
The command returns state of the service unit, which is usually active or inactive. Run the following command to verify whether a service unit is enabled to start automatically during system boot:
[root@host ~]# systemctl is-enabled sshd.service enabled
The command returns whether the service unit is enabled to start at boot time, which is usually enabled or disabled. To verify whether the unit failed during startup, run the following command:
[root@host ~]# systemctl is-failed sshd.service
active
The command either returns active if it is properly running or failed if an error has occurred during startup. In case the unit was stopped, it returns unknown or inactive. To list all the failed units, run the command:
# systemctl --failed --type=service