Systemd Concepts

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

Internal

TODO

TODO: This article was generated during the process of parsing https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units.Currently at “System State Overview” in the document. Next time I need systemd, finish it and transfer everything in here.

Purpose

The purpose of an init system is to manage (initialize, start, stop) components in the user space - programs that run after the kernel has booted. Some of those components are services and daemons for the server.

systemctl

systemctl is the central management tool for systemd.

Units and Unit Files

The resources managed by systemd are known as units.

Units represent different types of resources. The units are defined in files known as unit files. The type of each unit can be inferred from the suffix at the end of the file. Examples:

proc-sys-fs-binfmt_misc.automount
sys-subsystem-net-devices-eth0.device
my-nfs-mountpoint.mount    
systemd-ask-password-console.path  
session-1.scope   
dbus.service                               
rpcbind.service                           
system-getty.slice                       
rpcbind.socket      
local-fs.target 

Unit File Location

The package maintainer unit files reside in /usr/lib/systemd/system.

The user-created unit files conventionally reside in /etc/systemd/system.

If a user wants to modify one of the default unit files, they should copy them in /etc/systemd/system, because systemd will give priority to /etc.

Unit File Structure

A typical unit file is similar to:

[Unit]
Description=My Service
After=network.target

[Service]
ExecStart=/usr/local/bin/myserviced
Type=forking
PIDFile=/var/run/myservice.pid

[Install]
WantedBy=multi-user.target

[Unit]

Query the Units Known to systemd

To list all units known to systemd, use

systemctl list-units

The command will list the units and their state.

Services

For service management tasks, the target unit is a service unit, and their unit file have a .service suffix.

Starting a Service

Starting a service means using systemctl to execute instructions in the service's unit file. It must be executed as root:

systemctl start <application>.service

The short form

systemctl start <application>

also works.

Reload Configuration without a Restart

If the service supports reloading configuration without actually restarting the service, use:

systemctl reload <application>.service

Restart a Service

systemctl restart <application>.service

Reload or Restart a Service

If you are unsure whether the service has the configuration reload functionality, use reload-or-restart:

systemctl reload-or-restart <application>.service

Start (Enable) a Service Automatically at Boot

To configure a service to start automatically at boot it must be enabled:

systemctl enable <application>.service

This command creates a symbolic link from the service unit file, which is usually maintained in /lib/systemd/system into a location on disk where systemd looks for autostart files. This is usually a /etc/systemd/system/<some-target>.target.wants directory. See Target.

Example:

[root@openshift-master1 system]# systemctl enable docker
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'

Stop (Disable) a Service

systemctl disable <application>.service

Status of a Service

Status Report

To check the status of a service run:

systemctl status <application>.service

Active

A service can be active (running) or not active. To check whether a service is active (running), execute:

systemctl is-active <application>.service

This will return the current unit state as a string ("active" or "inactive"). The exit code will be "0" if it is active.

Enabled

A service can be configured to start at boot (enabled) or not enabled. To check whether a service is enabled, execute:

systemctl is-enabled <application>.service

This will return the current unit enabled state as a string ("enabled" or "disabled"). The exit code will be "0" if it is enabled.

Failed

systemctl can be used to check to see whether the service is in a failed state:

systemctl is-failed <application>.service

This will return "active" if it is running properly or "failed" if an error occurred. If the unit was intentionally stopped, it may return "unknown" or "inactive". An exit status of "0" indicates that a failure occurred and an exit status of "1" indicates any other status.

Loaded Unit

A unit is in a "loaded" state if the unit's configuration has been parsed by systemd. The configuration of loaded units is kept in memory.

Target

TODO