Systemd a standard process for managing start-up services in Linux operating systems. It is used for controlling which programs run when the Linux system boots up. It is a system manager and has become the new standard for Linux operating systems. Systemd allows you to create a custom systemd service to run and manage any process.
In this tutorial, we will explain how to manage services with systemd on Linux.
Starting with Systemtd and Systemctl Basics
By default, Systemd comes pre-installed in all major operating systems. You can verify the installed version of Systemd with the following command:
$ systemctl --version
systemd 245 (245.4-4ubuntu3.4)
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=hybrid
It’s clear from the above example, that we have systemd 245 version Installed.
Check where the binaries and libraries of systemd and systemctl are installed.
$ whereis systemd systemd: /usr/bin/systemd /usr/lib/systemd /etc/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz $ whereis systemctl systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz
You can also verify whether the Systemd is running or not with the following command:
$ ps -eaf | grep systemd
root 417 1 0 Jan30 ? 00:00:00 /lib/systemd/systemd-journald
root 464 1 0 Jan30 ? 00:00:01 /lib/systemd/systemd-udevd
systemd+ 713 1 0 Jan30 ? 00:00:03 /lib/systemd/systemd-resolved
message+ 825 1 0 Jan30 ? 00:00:02 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
root 852 1 0 Jan30 ? 00:00:00 /lib/systemd/systemd-logind
rasho 1043 1 0 Jan30 ? 00:00:00 /lib/systemd/systemd --user
rasho 1112 1043 0 Jan30 ? 00:00:02 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
rasho 18275 18094 0 13:32 pts/0 00:00:00 grep --color=auto systemd
[ads][box type=”note” align=”” class=”” width=””]Note: systemd is running as parent daemon (PID=1). In the above command ps with -e
select all Processes, -a
select all processes except session leaders and -f
for full format listing (i.e. -eaf
).[/box]
You can also analyze the time taken by each process at system boot with the following command:
$ systemd-analyze blame
2.508s dev-sda2.device
1.903s snapd.service
1.419s fwupd-refresh.service
1.275s fwupd.service
915ms lm-sensors.service
857ms man-db.service
831ms networkd-dispatcher.service
664ms logrotate.service
587ms udisks2.service
576ms systemd-logind.service
..............
To analyze the critical chain at boot with the following command:
$ systemd-analyze critical-chain
The time when unit became active or started is printed after the "@" character.
The time the unit took to start is printed after the "+" character.
graphical.target @6.768s
└─multi-user.target @6.768s
└─snapd.seeded.service @6.722s +44ms
└─snapd.service @4.817s +1.903s
└─basic.target @4.752s
└─sockets.target @4.752s
└─snapd.socket @4.751s +1ms
└─sysinit.target @4.745s
└─snapd.apparmor.service @4.592s +152ms
└─apparmor.service @4.397s +191ms
└─local-fs.target @4.395s
└─run-user-1000.mount @6.540s
└─local-fs-pre.target @2.187s
└─systemd-tmpfiles-setup-dev.service @2.053s +134ms
└─systemd-sysusers.service @1.863s +186ms
└─systemd-remount-fs.service @1.747s +112ms
└─systemd-journald.socket @1.730s
└─system.slice @1.726s
└─-.slice @1.726s
List all the available units.
$ systemctl list-unit-files
UNIT FILE STATE VENDOR PRESET
proc-sys-fs-binfmt_misc.automount static enabled
-.mount generated enabled
boot-efi.mount generated enabled
dev-hugepages.mount static enabled
dev-mqueue.mount static enabled
proc-sys-fs-binfmt_misc.mount disabled enabled
snap-android\x2dstudio-99.mount enabled enabled
List all running units.
$ systemctl list-units
UNIT LOAD ACTIVE SUB DESCRIPTION >
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Point >
dev-fuse.device loaded activating tentative /dev/fuse >
sys-devices-pci0000:00-0000:00:02.0-drm-card0-card0\x2dLVDS\x2d1-intel_backlight.device loaded active plugged /sys/devices/pci0000:00/0000:00:02.0/drm/card0/card0-LVDS-1/intel_backlight>
sys-devices-pci0000:00-0000:00:16.3-tty-ttyS4.device loaded active plugged 7 Series/C210 Series Chipset Family KT Controller >
sys-devices-pci0000:00-0000:00:19.0-net-enp0s25.device loaded active plugged 82579LM Gigabit Network Connection (Lewisville) >
sys-devices-pci0000:00-0000:00:1b.0-sound-card0.device loaded active plugged 7 Series/C216 Chipset Family High Definition Audio Controller >
sys-devices-pci0000:00-0000:00:1c.3-0000:03:00.0-net-wlo1.device loaded active plugged Centrino Advanced-N 6235 (AGN) >
sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.6-2\x2d1.6:1.0-bluetooth-hci0.device loaded active plugged /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0/bluetooth/hci>
sys-devices-pci0000:00-0000:00:1f.2-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda1.device loaded active plugged PNY_CS900_120GB_SSD EFI\x20System\x20Partition >
sys-devices-pci0000:00-0000:00:1f.2-ata1-host0-target0:0:0-0:0:0:0-block-sda-sda2.device loaded active plugged PNY_CS900_120GB_SSD 2 >
sys-devices-pci0000:00-0000:00:1f.2-ata1-host0-target0:0:0-0:0:0:0-block-sda.device loaded active plugged PNY_CS900_120GB_SSD
List all failed units.
$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● fwupd-refresh.service loaded failed failed Refresh fwupd metadata and update motd
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
1 loaded units listed.
[ads][box type=”info” align=”” class=”” width=””]The output has the following columns :
UNIT: The systemd service unit name
LOAD: Shows whether the unit definition was properly read and loaded
ACTIVE: Describes if the unit is active.
SUB: Low-level activation state of the unit, giving more detailed information about the unit. This will vary by unit type.
DESCRIPTION: The service unit’s description.[/box]
Manage Services with Systemd
Systemctl provides an easier way to manage the systemd services.
List all services (including enabled and disabled).
$ systemctl list-unit-files --type=service
UNIT FILE STATE VENDOR PRESET
accounts-daemon.service enabled enabled
acpid.service disabled enabled
alsa-restore.service static enabled
alsa-state.service static enabled
alsa-utils.service masked enabled
anacron.service enabled enabled
apparmor.service enabled enabled
apt-daily-upgrade.service static enabled
apt-daily.service static enabled
autovt@.service enabled enabled
avahi-daemon.service enabled enabled
blk-availability.service enabled enabled
bluetooth.service enabled enabled
bolt.service static enabled
...................
To start a systemd service, use the systemctl start command:
$ sudo systemctl start name.service
You can leave .service suffix. For example, to start the apache server on Ubuntu:
$ sudo systemctl start apache2
To stop a running service:
$ sudo systemctl stop apache2
To restart the Apache service, run the following command:
$ systemctl restart apache2
To reload the Apache service, run the following command:
$ systemctl reload apache2
To enable the Apache service to start after system reboot, run the following command:
$ systemctl enable apache2
To remove the Apache service from the system start up, run the following command:
$ systemctl disable apache2
To kill the Apache service, run the following command:
$ systemctl kill apache2
To mask the Apache service, run the following command:
$ systemctl mask apache2
To unmask the Apache process, run the following command:
$ systemctl unmask apache2
To check whether the Apache service is enabled or not, run the following command:
$ systemctl is-enabled apache2
To check the status of the Apache service, run the following command:
$ systemctl status apache2
After renaming or deleting any systemd file, you will need to reload it to apply the changes. To reload the systemd service file, run the following command:
$ systemctl daemon-reload