Ubuntu uses the systemd
system and service manager as the init system. This means systemd runs as the first process at boot (PID 1) and manages all further user processes. Systemd, in turn, is managed using the systemctl tool.
Systemctl is commonly used to check the status of services or stop, start, enable, or disable them. But you can also use it to monitor and control the overall system state.
Listing systemd Units with Systemctl
systemd uses a dependency system of ‘units’, which are basically different types of resources required for system boot-up and maintenance. The most important of these are service units that manage daemons and sub-processes.
There are 11 unit types in total, and the default behavior of systemctl is to list all units currently loaded by systemd. It’ll list everything from socket and device units to mount units.
systemctl
If you want to list service units only, you can specify the unit type as service.
systemctl -l --type=service
Additionally, you can include the all
option if you want to view inactive units as well.
systemctl -l --type=service -all

In the output,
- UNIT is the systemd unit name
- LOAD defines whether the unit was properly loaded
- ACTIVE shows the high-level unit state
- SUB shows a low-level (more exact) description of the unit state
- DESCRIPTION shows the unit description
The state
option is also very useful as it allows you to filter the extensive output and list services according to their status. The possible service states are active
, inactive
, activating
, deactivating
, failed
, not-found
, and dead
.
For instance, to list dead service units only, you could use
systemctl -l --state=dead
Checking Service Details
The list-units
flag provides us with an overview of the service states, but often you’ll need details on a specific service instead.
For instance, you may want to check the status of your NGINX server. For this, you would use the status
command.
systemctl status nginx
If you want to check a service’s properties instead, you can use the show
command.
systemctl show nginx
This’ll list over 200 properties though, so doing this every time isn’t ideal. If you remember the exact property you want to check, you can search for it with the -p
flag like so
systemctl show nginx -p UMask
Managing Services with Systemctl
Now that you know how to list services and get detailed info on them, let’s talk about changing service states.
Enable and Start Services
First of all, you can enable a service like so
systemctl enable nginx
This’ll create the necessary symlinks and reload the system manager configuration so that the service auto-starts at boot. But keep in mind that this won’t activate the service for the current session. For that, you must include the now
switch.
systemctl enable nginx --now
Or, you can use the start command instead.
systemctl start nginx
Disable and Stop Services
The opposite is also true for the aforementioned points. You can disable a service like so
systemctl disable nginx
This’ll remove the symlinks made using enable
or link
and the service won’t start at boot. If you want to stop the service immediately, you can include the now
option.
systemctl disable nginx --now
Or, you can use the stop
command.
systemctl stop nginx
Restart and Reload Services
The restart
command stops and then starts the specified service units. If the service is currently not yet running, it’ll activate the service the same as the start command.
systemctl restart nginx
We’ve been using an NGINX server in our examples. If you’re dealing with a similar program that can reload its configurations without restarting the service, you can use the reload
command instead of restart
.
systemctl reload nginx
Changing the System State
Systemd uses targets similar to how traditional init systems used runlevels to define the operating state.
Run level | systemd Target | Description |
Runlevel 0 | poweroff.target | Turn off the system. |
Runlevel 1 | rescue.target | Single-user mode. |
Runlevel 3 | multi-user.target | Multi-user non-graphical mode. |
Runlevel 5 | graphical.target | Multi-user graphical mode. |
Runlevel 6 | reboot.target | Reboots the device. |
emergency | emergency.target | Emergency shell. |
You can check the default target used by systemd when booting with
systemctl get-default
There are a couple of ways to change targets. If you want to change the default target, you can use set-default
. For instance, if you wanted to boot with a graphical login, you could set it like so
systemctl set-default graphical.target
The second method is switching runlevels using isolate
. For instance, if you need to switch to rescue mode, you could use
systemctl isolate rescue.target
Systemctl supports shortcuts for certain commands like rescue, so you can also directly use
systemctl rescue
Other useful shortcuts include poweroff and reboot.
systemctl poweroff
systemctl reboot
Bonus Tip: You can also use the reboot command to directly boot to the firmware setup page.
systemctl reboot --firmware-setup