Systemd Concepts
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] Section
The [Unit] section contains a description of the service and its dependency declarations. In the example above, we declare that systemd must not attempt to start the service until the network is not running on the host. For more practical details on how to declare dependencies, see systemd Declaring a Service Dependency.
[Service] Section
ExecStart= represents the path to the binary to execute when the service is started.
Type= can be set to one of "simple", "forking", "oneshot", "dbus", "notify" or "idle"
If set to "forking", it is expected that the process configured with ExecStart= will call fork() as part of its start-up. The parent process is expected to exit when start-up is complete and all communication channels are set up. The child continues to run as the main daemon process. This is the behavior of traditional UNIX daemons. If this setting is used, it is recommended to also use the PIDFile= option, so that systemd can identify the main process of the daemon. systemd will proceed with starting follow-up units as soon as the parent process exits.
PIDFile= takes an absolute file name pointing to the PID file of the service's daemon. PIDFile=is recommended for services where Type= is set to forking. systemd will read the PID of the main process of the daemon after start-up of the service. systemd will not write to the file configured here, although it will remove the file after the service has shut down if it still exists. systemd uses this file to identify the main process of the daemon, but the file will need to be written by other means.
[Install] Section
WantedBy=multi-user.target means that the service should be started while in multi-user mode (equivalent with System V run level 3).
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