As a Linux system administrator, having deep knowledge of service management is critical for both operations and troubleshooting. The systemctl command offers powerful fine-grained control over the systemd init system, which has fast become the standard for modern Linux distributions.
The Rise of Systemd in Linux
Systemd was first adopted in 2011 by Fedora. Since then, all major enterprise server and cloud Linux distributions have transitioned from legacy init systems to adopt systemd as the standardized service manager:
| Distribution | Init System | Year Adopted |
|---|---|---|
| RedHat Enterprise Linux / CentOS | systemd | 2014 |
| Debian | systemd | 2015 |
| Ubuntu | systemd | 2015 |
| SUSE Linux Enterprise | systemd | 2016 |
As of 2022, 99% of Linux installations run systemd as their init system. The dominant distributions all rely on it for booting, process lifecycle management, service monitoring, and resource control across bare metal systems, virtual machines, and Linux containers.
The init system constitutes the first process on a Linux system, with PID 1. It serves as the foundation on which all other services and processes depend. Therefore transitioning init systems is a massive architectural change.
The key driving factors behind systemd adoption include:
- Parallelized boot and service start – Improves boot speed 3-4X over legacy init
- Transactional dependencies – Robust service dependency management
- Resource isolation – Control groups (cgroups) for security and resource limits
- Unified structure – Centralized unit files rather than multiple configs
- Better monitoring/observability – Integrated logging pipeline
Replacing old init systems like System V init or Upstart with systemd aims to improve multiple aspects of Linux – boot speed, service control, security isolation, and management.
Systemd Architecture Overview
Systemd starts up very early in the Linux boot process as PID 1. Key architectural components include:
- systemd – The system and service manager daemon
- journald – Event logging system that creates structured logs
- networkd – Handles overall network configuration
- timedated – Maintains time sync and daylight adjustments
- logind – Manages user sessions andseats
- udevd – Kernel device event management via dynamic nodes
Systemd then starts various target units, which serve as integration points for other unit types:
- Services
- Devices/Drivers
- Filesystems
- Sockets/Communication channels
- Timers
- Paths
Finally, systemd continues monitoring and actively managing all these units while the system runs – ensuring they keep working properly.
Now let‘s explore how systemctl enables administrators to tap into all aspects of systemd to control Linux.
Systemd "Units" Explained
The central abstraction used by systemd is called a "unit." Units are objects that systemd knows how to manage during startup, runtime, and shutdown. Some types include:
Service units (.service) – Represent system services that constitute applications/daemons. Contains info like this:
[Unit]
Description=HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
Target units (.target) – Group multiple units to activate together in a particular context. For example – graphical.target, multi-user.target, shutdown.target etc.
Socket units (.socket) – Declarative socket units manage IPC/network sockets as activation triggers for service start:
[Unit]
Description=Generation Socket
[Socket]
ListenStream=/run/gen/gen.sock
Accept=yes
[Install]
WantedBy=sockets.target
Unit files use ini-style sections for metadata, dependencies, behavior configuration and execution environment.
Key Systemctl Commands
The systemctl utility allows administrators to query and control the status of all systemd units. Commands include:
| Command | Description |
|---|---|
| systemctl list-units | List current units/status |
| systemctl list-units –failed | Failed units |
| systemctl list-units –type=service | Filter by unit type |
| systemctl cat nginx.service | View unit file |
| systemctl start/stop/restart nginx.service | Start, stop or restart service |
| systemctl enable/disable nginx.service | Enable/disable automatic service start |
| systemctl reload nginx.service | Reload config without interrupting pending operations |
| systemctl status nginx.service | Check status/process state for unit |
| systemctl edit nginx.service | Edit unit file directly |
| systemctl list-dependencies nginx.service | List dependency tree for service |
This table summarizes the most essential systemctl capabilities – but there are many more available to master systemd.
Analyzing System State
To query systemd about current units and state, use systemctl list-units. For example, to show all loaded units:
# systemctl list-units
UNIT LOAD ACTIVE JOB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting Arbitrary Executable File Formats File System Automount Poi
sockets.target loaded active active Sockets
dbus.socket loaded active running D-Bus System Message Bus Socket
...
The output includes the unit name, load state, activation status, related jobs/tasks status plus a description.
Useful filters:
# See only active units
systemctl list-units --state=active
# See only failed units
systemctl list-units --state=failed
# Check specific unit
systemctl is-active application.service
systemctl is-enabled application.service
systemctl is-failed application.service
This allows inspecting exactly which units are active at runtime plus their relationships.
Similarly, systemctl status unit shows details of whether a unit works correctly:
# systemctl status bluetooth
● bluetooth.service - Bluetooth service
Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor preset
Active: inactive (dead)
Docs: man:bluetoothd(8)
Note the status displays the unit state, tracebacks if it crashed, and other debugging metadata.
Managing System Services
For Linux engineers, the most common use of systemctl is to manage system services – applications and daemons running on the server. Actions include:
Start/Stop/Restart:
systemctl start httpd.service
systemctl stop httpd.service
systemctl restart httpd.service
Reload to apply updated configs:
systemctl reload httpd.service
Check status:
systemctl status httpd.service
Enable/Disable automatic startup:
systemctl enable httpd.service
systemctl disable httpd.service
Review logs in real-time:
journalctl -u httpd.service -f
These operations provide fine-grained control over lifecycle and diagnostics of services – without needing to know about scripts in /etc/init.d.
Examples of common services include:
- Web servers– httpd, nginx
- Databases – mysqld, mongod, redis, postgresql
- Message brokers – rabbitmq
- Container engines – docker, containerd
- Networking – nfs, dnsmasq, openvpn
Targets, Slices and Sockets
While service units represent the processes/apps running on a host, systemd has other abstractions that are equally useful:
Targets tie groups of units together for activation in a staged order. For example – network-online.target waits for networking before allowingdependent apps to start.
systemctl list-dependencies network-online.target
Shows the dependency tree leading down through network manager, sockets setup etc. These targets sequence boot process.
Slices allocate resources like CPU and memory among hierarchical groups. The default slices are -machine.slice, system.slice and user.slice. You can create custom child slices using control groups.
For example, limiting slice CPU usage:
systemctl set-property fooslice.slice CPUQuota=20%
Sockets enable socket-activated service launch triggering. For example:
stream.socket -> stream.service
When the first client connects to a socket, systemd automatically starts the associated service. Great for just in time application start rather than always-on!
Additional Systemctl Capabilities
Beyond service/unit control and introspection, systemctl offers additional system management capabilities:
# Set system date, time and timezone
systemctl set-timezone Europe/London
# Reexecute user manager/group commands
systemctl daemon-reload
# List all available unit files
systemctl list-unit-files
# Mask/unmask unit files to prevent enablement
systemctl mask nginx.service
# Reload systemd manager itself
systemctl daemon-reexec
So while mainly used for services, systemctl offers a Swiss army knife of further low-level systemd controls.
Safe Reboots and Shutdowns
For safe system restart, halt or poweroff operations, systemctl also replaces shutdown commands:
# Reboot
systemctl reboot
# Power down cleanly
systemctl poweroff
# Halt without power off
systemctl halt
# Schedule shutdown for later
systemctl shutdown 5min
Using systemctl ensures units complete active work before shutting down.
Migrating to Systemd in Enterprise Environments
For Linux systems engineers working in enterprise environments, upgrading from older init systems to systemd requires some porting of configurations and operational practices:
- Convert init.d scripts – Legacy sysv or Upstart scripts should be migrated to native systemd unit files where possible
- Evaluate 3rd party tools compatibility – Some backup tools have yet to add systemd support, which could break workflows
- Update runlevel usage – systemd replaces concept of runlevels with targets
- Validate timers/scheduled jobs – Some cron jobs may need to become timer units
- Use journalctl for logging – Centralized logging pipeline
Testing in dev/staging environments is advised before deploying such a foundationally invasive upgrade.
Longer term, embracing systemd and systemctl paves the way for easier transition to Linux containers and Kubernetes, where host-level visibility and controls are limited.
Systemd Helps Unify Linux Infrastructure
Thanks to adoption by all major enterprise Linux distributions over past 5 years, systemd can now be relied on as a standardized component from bare metal and VMs to Kubernetes infrastructure:
- Bare metal / VM hosts – Centralized control point for boot, services, devices
- Container engine hosts (docker, containerd) – Systemd integration for health monitoring
- Destined to underpin serverless frameworks
Learning systemctl provides transferable skills for administering hosts across this spectrum.
Whether starting, stopping or monitoring services, inspecting unit files, modifying boot targets, or safely rebooting hosts, systemctl is now indispensable for any Linux sysadmin, SRE or devops engineer working extensively with Linux infrastructure.


