Listing systemd units shows what the service manager currently knows about across services, sockets, timers, mounts, devices, paths, scopes, and other unit types. That inventory is useful before managing a unit directly, while tracing boot behavior, or when confirming which exact unit name a dependency, package, or failure message is referring to.
The systemctl list-units command asks the running manager for units currently loaded in memory and prints the LOAD, ACTIVE, and SUB states for each one. This runtime view can include active units, failed units, dependency-pulled units, and units pinned by other programs, but it does not show every unit file installed on disk and it never shows uninstantiated templates such as example@.service.
On busy hosts the default output can be dominated by .device units, so repeated --type filters, name patterns, and --state filters are often the fastest way to narrow the list. Adding --all only expands the loaded set to include inactive units, not the full on-disk inventory, and per-user units live under systemctl --user list-units instead of the system manager.
Related: How to list systemd services using systemctl
Related: How to list systemd timers
The system instance listing commands are read-only and normally do not require sudo. Use systemctl --user list-units for the logged-in user's manager instead of the system-wide manager.
$ systemctl list-units --no-pager UNIT LOAD ACTIVE SUB DESCRIPTION -.mount loaded active mounted Root Mount accounts-daemon.service loaded active running Accounts Service dbus.service loaded active running D-Bus System Message Bus dbus.socket loaded active running D-Bus System Message Bus Socket systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories ##### snipped ##### 223 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
The runtime table can mix many unit types in one view, and the LOAD, ACTIVE, and SUB columns describe whether each unit definition was loaded, its high-level state, and its unit-type-specific detailed state.
$ systemctl list-units --all --no-pager UNIT LOAD ACTIVE SUB DESCRIPTION accounts-daemon.service loaded active running Accounts Service apt-daily.service loaded inactive dead Daily apt download activities systemd-ask-password-console.path loaded inactive dead Dispatch Password Requests to Console Directory Watch ● auditd.service not-found inactive dead auditd.service systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories ##### snipped ##### 525 loaded units listed. To show all installed unit files use 'systemctl list-unit-files'.
--all expands the loaded set, but it still does not replace list-unit-files. A not-found row means a unit name was referenced even though no backing unit file is currently installed.
$ systemctl list-units --type=service --type=socket --type=timer --no-pager UNIT LOAD ACTIVE SUB DESCRIPTION accounts-daemon.service loaded active running Accounts Service avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack dbus.service loaded active running D-Bus System Message Bus dbus.socket loaded active running D-Bus System Message Bus Socket systemd-journald.service loaded active running Journal Service apt-daily.timer loaded active waiting Daily apt download activities systemd-tmpfiles-clean.timer loaded active waiting Daily Cleanup of Temporary Directories ##### snipped ##### 92 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
Repeating --type is the quickest way to drop noisy .device entries. When a specific unit type has its own dedicated listing command, such as systemctl list-timers, that command usually adds more type-specific columns.
$ systemctl list-units 'systemd-*' --no-pager --no-legend systemd-binfmt.service loaded active exited Set Up Additional Binary Formats systemd-journald.service loaded active running Journal Service systemd-logind.service loaded active running User Login Management systemd-oomd.service loaded active running Userspace Out-Of-Memory (OOM) Killer systemd-resolved.service loaded active running Network Name Resolution ##### snipped #####
Quote glob patterns such as 'systemd-*' so the shell passes them to systemctl unchanged.
$ systemctl list-units --all --state=inactive --type=service --no-pager --no-legend alsa-state.service loaded inactive dead Manage Sound Card State (restore and store) apt-daily.service loaded inactive dead Daily apt download activities ● auditd.service not-found inactive dead auditd.service cloud-init.service loaded inactive dead Cloud-init: Network Stage ##### snipped #####
$ systemctl --state=help Available unit load states: stub loaded not-found ##### snipped ##### Available unit active states: active reloading inactive failed ##### snipped #####
systemctl --state=help prints the state values supported by the installed systemd build, which is safer than assuming the available state names never change.
$ systemctl list-unit-files 'systemd-*' --no-pager --no-legend systemd-ask-password-console.path static - systemd-ask-password-plymouth.path static - systemd-backlight@.service static - systemd-boot-check-no-failures.service disabled disabled systemd-confext.service disabled enabled ##### snipped #####
list-unit-files reads the on-disk inventory, so it can show installed units and templates such as systemd-backlight@.service that never appear in list-units until an instance is actually loaded.