Systemctl is a systemd utility that is responsible for Controlling the systemd system and service manager. Systemd is a collection of system management daemons, utilities, and libraries which serves as a replacement of System V init daemon. Systemd functions as central management and configuration platform for UNIX like system.
In the Linux, Ecosystem Systemd has been implemented on most of the standard Linux Distribution with a few exceptions. Systemd is the parent Process of all other daemons often but not always.
This article aims at throwing light on “How to control System and Services” on a system running systemd.
Starting with Systemtd and Systemctl Basics
1. First, check if systemd is installed on your system or not, and what is the version of currently installed Systemd?
# systemctl --version systemd 215 +PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR
It’s clear from the above example, that we have systemd 215 version Installed.
2. Check where the binaries and libraries of systemd and systemctl are installed.
# whereis systemd 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
3. Check whether systemd is running or not.
# ps -eaf | grep [s]ystemd root 1 0 0 16:27 ? 00:00:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 23 root 444 1 0 16:27 ? 00:00:00 /usr/lib/systemd/systemd-journald root 469 1 0 16:27 ? 00:00:00 /usr/lib/systemd/systemd-udevd root 555 1 0 16:27 ? 00:00:00 /usr/lib/systemd/systemd-logind dbus 556 1 0 16:27 ? 00:00:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
Notice: 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).
Also, note the square brackets in the above example and the rest of the examples to follow. Square Bracket expression is part of grep’s character class pattern matching.
4. Analyze systemd boot process.
# systemd-analyze Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s
5. Analyze time taken by each process at boot.
# systemd-analyze blame 8.565s mariadb.service 7.991s webmin.service 6.095s postfix.service 4.311s httpd.service 3.926s firewalld.service 3.780s kdump.service 3.238s tuned.service 1.712s network.service 1.394s lvm2-monitor.service 1.126s systemd-logind.service ....
6. Analyze critical chain at boot.
# systemd-analyze critical-chain The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. multi-user.target @20.222s └─mariadb.service @11.657s +8.565s └─network.target @11.168s └─network.service @9.456s +1.712s └─NetworkManager.service @8.858s +596ms └─firewalld.service @4.931s +3.926s └─basic.target @4.916s └─sockets.target @4.916s └─dbus.socket @4.916s └─sysinit.target @4.905s └─systemd-update-utmp.service @4.864s +39ms └─auditd.service @4.563s +301ms └─systemd-tmpfiles-setup.service @4.485s +69ms └─rhel-import-state.service @4.342s +142ms └─local-fs.target @4.324s └─boot.mount @4.286s +31ms └─systemd-fsck@dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d19608096 └─dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d196080964.device @4
Important: Systemctl accepts services (.service), mount point (.mount), sockets (.socket) and devices (.device) as units.
7. List all the available units.
# systemctl list-unit-files UNIT FILE STATE proc-sys-fs-binfmt_misc.automount static dev-hugepages.mount static dev-mqueue.mount static proc-sys-fs-binfmt_misc.mount static sys-fs-fuse-connections.mount static sys-kernel-config.mount static sys-kernel-debug.mount static tmp.mount disabled brandbot.path disabled .....
8. 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 Syste sys-devices-pc...0-1:0:0:0-block-sr0.device loaded active plugged VBOX_CD-ROM sys-devices-pc...:00:03.0-net-enp0s3.device loaded active plugged PRO/1000 MT Desktop Adapter sys-devices-pc...00:05.0-sound-card0.device loaded active plugged 82801AA AC'97 Audio Controller sys-devices-pc...:0:0-block-sda-sda1.device loaded active plugged VBOX_HARDDISK sys-devices-pc...:0:0-block-sda-sda2.device loaded active plugged LVM PV Qzyo3l-qYaL-uRUa-Cjuk-pljo-qKtX-VgBQ8 sys-devices-pc...0-2:0:0:0-block-sda.device loaded active plugged VBOX_HARDDISK sys-devices-pl...erial8250-tty-ttyS0.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS0 sys-devices-pl...erial8250-tty-ttyS1.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS1 sys-devices-pl...erial8250-tty-ttyS2.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS2 sys-devices-pl...erial8250-tty-ttyS3.device loaded active plugged /sys/devices/platform/serial8250/tty/ttyS3 sys-devices-virtual-block-dm\x2d0.device loaded active plugged /sys/devices/virtual/block/dm-0 sys-devices-virtual-block-dm\x2d1.device loaded active plugged /sys/devices/virtual/block/dm-1 sys-module-configfs.device loaded active plugged /sys/module/configfs ...
9. List all failed units.
# systemctl --failed UNIT LOAD ACTIVE SUB DESCRIPTION kdump.service loaded failed failed Crash recovery kernel arming 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. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
10. Check if a Unit (cron.service) is enabled or not?.
# systemctl is-enabled crond.service enabled
11. Check whether a Unit or Service is running or not?.
# systemctl status firewalld.service firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled) Active: active (running) since Tue 2015-04-28 16:27:55 IST; 34min ago Main PID: 549 (firewalld) CGroup: /system.slice/firewalld.service └─549 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid Apr 28 16:27:51 tecmint systemd[1]: Starting firewalld - dynamic firewall daemon... Apr 28 16:27:55 tecmint systemd[1]: Started firewalld - dynamic firewall daemon.
Control and Manage Services Using Systemctl
12. List all services (including enabled and disabled).
# systemctl list-unit-files --type=service UNIT FILE STATE arp-ethers.service disabled auditd.service enabled [email protected] disabled blk-availability.service disabled brandbot.service static collectd.service disabled console-getty.service disabled console-shell.service disabled cpupower.service disabled crond.service enabled dbus-org.fedoraproject.FirewallD1.service enabled ....
13. How do I start, restart, stop, reload and check the status of a service (httpd.service) in Linux.
# systemctl start httpd.service # systemctl restart httpd.service # systemctl stop httpd.service # systemctl reload httpd.service # systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since Tue 2015-04-28 17:21:30 IST; 6s ago Process: 2876 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS) Main PID: 2881 (httpd) Status: "Processing requests..." CGroup: /system.slice/httpd.service ├─2881 /usr/sbin/httpd -DFOREGROUND ├─2884 /usr/sbin/httpd -DFOREGROUND ├─2885 /usr/sbin/httpd -DFOREGROUND ├─2886 /usr/sbin/httpd -DFOREGROUND ├─2887 /usr/sbin/httpd -DFOREGROUND └─2888 /usr/sbin/httpd -DFOREGROUND Apr 28 17:21:30 tecmint systemd[1]: Starting The Apache HTTP Server... Apr 28 17:21:30 tecmint httpd[2881]: AH00558: httpd: Could not reliably determine the server's fully q...ssage Apr 28 17:21:30 tecmint systemd[1]: Started The Apache HTTP Server. Hint: Some lines were ellipsized, use -l to show in full.
Note: When we use commands like start, restart, stop and reload with systemctl, we will not get any output on the terminal, the only status command will print the output.
14. How to active a service and enable or disable a service at boot time (autostart service at system boot).
# systemctl is-active httpd.service # systemctl enable httpd.service # systemctl disable httpd.service
15. How to mask (making it impossible to start) or unmask a service (httpd.service).
# systemctl mask httpd.service ln -s '/dev/null' '/etc/systemd/system/httpd.service' # systemctl unmask httpd.service rm '/etc/systemd/system/httpd.service'
16. How to a Kill a service using systemctl command.
# systemctl kill httpd # systemctl status httpd httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: failed (Result: exit-code) since Tue 2015-04-28 18:01:42 IST; 28min ago Main PID: 2881 (code=exited, status=0/SUCCESS) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" Apr 28 17:37:29 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:29 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:39 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:39 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:49 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:49 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:59 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 17:37:59 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled. Apr 28 18:01:42 tecmint systemd[1]: httpd.service: control process exited, code=exited status=226 Apr 28 18:01:42 tecmint systemd[1]: Unit httpd.service entered failed state. Hint: Some lines were ellipsized, use -l to show in full.
Control and Manage Mount Points using Systemctl
17. List all system mount points.
# systemctl list-unit-files --type=mount UNIT FILE STATE dev-hugepages.mount static dev-mqueue.mount static proc-sys-fs-binfmt_misc.mount static sys-fs-fuse-connections.mount static sys-kernel-config.mount static sys-kernel-debug.mount static tmp.mount disabled
18. How do I mount, unmount, remount, reload system mount points and also check the status of mount points on the system?
# systemctl start tmp.mount # systemctl stop tmp.mount # systemctl restart tmp.mount # systemctl reload tmp.mount # systemctl status tmp.mount tmp.mount - Temporary Directory Loaded: loaded (/usr/lib/systemd/system/tmp.mount; disabled) Active: active (mounted) since Tue 2015-04-28 17:46:06 IST; 2min 48s ago Where: /tmp What: tmpfs Docs: man:hier(7) http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems Process: 3908 ExecMount=/bin/mount tmpfs /tmp -t tmpfs -o mode=1777,strictatime (code=exited, status=0/SUCCESS) Apr 28 17:46:06 tecmint systemd[1]: Mounting Temporary Directory... Apr 28 17:46:06 tecmint systemd[1]: tmp.mount: Directory /tmp to mount over is not empty, mounting anyway. Apr 28 17:46:06 tecmint systemd[1]: Mounted Temporary Directory.
19. How to active, enable or disable a mount point at boot time (auto mount at system boot).
# systemctl is-active tmp.mount # systemctl enable tmp.mount # systemctl disable tmp.mount
20. How to mask (making it impossible to start) or unmask a mount point in Linux.
# systemctl mask tmp.mount ln -s '/dev/null' '/etc/systemd/system/tmp.mount' # systemctl unmask tmp.mount rm '/etc/systemd/system/tmp.mount'
Control and Manage Sockets using Systemctl
21. List all available system sockets.
# systemctl list-unit-files --type=socket UNIT FILE STATE dbus.socket static dm-event.socket enabled lvm2-lvmetad.socket enabled rsyncd.socket disabled sshd.socket disabled syslog.socket static systemd-initctl.socket static systemd-journald.socket static systemd-shutdownd.socket static systemd-udevd-control.socket static systemd-udevd-kernel.socket static 11 unit files listed.
22. How do I start, restart, stop, reload and check the status of a socket (example: cups.socket) in Linux.
# systemctl start cups.socket # systemctl restart cups.socket # systemctl stop cups.socket # systemctl reload cups.socket # systemctl status cups.socket cups.socket - CUPS Printing Service Sockets Loaded: loaded (/usr/lib/systemd/system/cups.socket; enabled) Active: active (listening) since Tue 2015-04-28 18:10:59 IST; 8s ago Listen: /var/run/cups/cups.sock (Stream) Apr 28 18:10:59 tecmint systemd[1]: Starting CUPS Printing Service Sockets. Apr 28 18:10:59 tecmint systemd[1]: Listening on CUPS Printing Service Sockets.
23. How to active a socket and enable or disable at boot time (autostart socket at system boot).
# systemctl is-active cups.socket # systemctl enable cups.socket # systemctl disable cups.socket
24. How to mask (making it impossible to start) or unmask a socket (cups.socket).
# systemctl mask cups.socket ln -s '/dev/null' '/etc/systemd/system/cups.socket' # systemctl unmask cups.socket rm '/etc/systemd/system/cups.socket'
I’m quoting ‘Notice: systemd is running as parent daemon (PID=1).’ here, I guess the ppid is the one that equals one, and the init service is the one with pid=1, as it’s the first daemon service initiated by the kernel
edit :
I’m asking this question, as I’m confused about init & systems. Considering the fact that PIDs are assigned in ascending order, and that init always get the PID 1. am I missing something?
I am just about starting with Ubuntu on Windows 10 – have tried it with WSL 2 and from Ubuntu as well.
I started following your instructions, but couldn’t go beyond this point.
This returned an empty value, and hence am unable to proceed any farther. I have been stuck at this error now for weeks BUT no luck.
I always get this error
I will be very thankful and appreciate a lot if someone here can bail me out of it?
TIA
From the error, it seems that the systemd is not the init system. I never used WSL but MS might not be using systems.
Can you see systemd in the output of top command?
In RedHat 7 to get systemd version run
systemctl --version
but notsystemd --version
.@Mohamed amine TLILI: This was mentioned in an earlier comment (May 28, 2015, by McBuhl) along with the suggestion to make the correction in the blog post.
I don’t know how long it normally takes to make corrections to a blog post here, but the good news is that we’re now 5 years closer to seeing the correction made.
@Donald,
Corrected the command in the article…
Superb pots. I would just like to add that all those system services also generate logs. With systemd, these logs can be managed centrally with another component called journalctl. The main configuration file is in /etc/systemd/journald.conf.
Fear that you could dedicate another magnificent pots. Thanks a lot.
I would like to know about the relationship of numbering of files such as this in your teachings:
90-CPUShares.conf
I used a similar scheme with a .network file as seen in some tutorials. For Example:
10-dhcp.network
20-static.network
30-static.network
My belief is that the lower number .network file starts first?? Are these just arbitrary numbers? Could I use 70-dhcp.network&80.dhcp.network in the same fashion?? 99-* seems to be the last number called up.
Also these numbers schemes look like what I see in UDEV as well…
Keep up the great work
Really useful guide.
Keep up the great work.
I see one command not covered that I use alot.
systemctl reenable
This allows the unit file to reload and writes a new symbolic link to /usr/lib/
I have also found the systemctl edit –full allows you to edit the unit control file in /etc/systemd/system folder. Helpful for setting the After= setting for controlling the startup order of services.
@Frank,
Thanks for appreciating our work and giving us valuable tip, we’ve will check and add to the list as per your suggestions.
Thank You
Just to be clear the “systemctl edit –full” needs a service to work on. For example:
systemctl edit –full hostapd
To this file I add-
After=dnsmasq.service
To have hostapd wait for dnsmasq to start first.
It saves the file with an odd file extension that is actually the unit file. Just edit and save(ignore name). Another advantage with this method is that it reloads and reenables the service thus writing the needed symbolic links for you with a single swoop.
Nice and extensive overview of available commands.
Question: For controlling our applications we use supervisord, which allows one-shot commands as you present here, but also provides interactive shell, where one can call commands like “start svcA”, “restart svcB”, “tail svcA”, or even “follow mode” “tail -f svcA”. The interactive mode is very handy as it does not require typing so long commands.
Question: is there any interactive console controlling systemd defined services?
@Jan,
Thanks for the tips, never ever heard about supervisord, let me check how it works and also to be fact I really don’t have any idea in controlling systemd via interactive shell, let me check and get back to you..
very complete handy cheat sheet that i should bookmark it now! thanks!
Hi,
Very nice article
thanks a lot
Thanks @ Jalal Hajigholamali for your feedback
Keep connected to tecmint.com
Thanks, I am still running nix distro with init but will be useful some day when using systemd.
:) if you don’t start using systemd, you will be left behind in the fast moving Linux World.
‘systemd –version’ doesn’t work. It is ‘systemctl –version’ that works.
try
# systemd-run –version
You may thank me later. :)
I’d thank you even more if yo’d correct it in the blog post – as I had the same error as CertDepot
+ copy-pasting runs into error, too, because “–” is altered into a long “-“: Failed to find executable –version: No such file or directory
I love the conciseness of how-to posts like this one. But yeah, fast-forward 3 yrs and ‘systemd –version’ is still in the blog post. If one needs to read comments to get the correct info, then that whole conciseness thing goes out the window.
Thanks for the in-depth how-to on using the systemd control system tool. Lots of great examples!
Welcome Bill M