591

How can I list all enabled services from systemctl?

I know running systemctl command by itself lists all services, but I would like to only get the enabled ones.

5
  • what do you mean by enabled? You mean services that are running?
    – Gen
    Jul 5, 2016 at 18:28
  • 14
    @Gen enabling a service is quite different from starting it. See man systemctl.
    – Jos
    Jul 5, 2016 at 18:35
  • 6
    Fascinating. The lowest rated answer is the most "correct" answer, even though it is clearly not the best answer. This excellent question (and its answers) is an interesting example of how systemd violates the long-standing (and brilliant) design principles of Unix & Co. @FelipeAlvarez complains that the most-accepted answer assumes systemd follows the unix design philosopy, but systemd/systemctl can do exactly what he wants (most experienced users will just consider that complete bloat). I begin to see more clearly why Linus Torvalds is so vehemently critical of systemd.
    – BISI
    Dec 13, 2018 at 18:20
  • If you want to list "templated" services ([email protected]), do not forget to add "--all" - thanks to @rafdouglas below.
    – jehon
    Jul 6, 2022 at 14:01
  • @BISI is the lowest rated answer today still the answer that was lowest rated when you wrote your comment - or, iow, which answer do you think is the correct one? Mar 31 at 15:53

10 Answers 10

774

systemctl list-unit-files | grep enabled will list all enabled ones.

If you want which ones are currently running, you need systemctl | grep running.

Use the one you're looking for. Enabled, doesn't mean it's running. And running doesn't mean it's enabled. They are two different things.

Enabled means the system will run the service on the next boot. So if you enable a service, you still need to manually start it, or reboot and it will start.

Running means it's actually running right now, but if it's not enabled, it won't restart when you reboot.

22
  • 12
    annoying to have to use an external tool (grep) to show this vital information. But thank you for showing us the way :) Feb 15, 2017 at 2:43
  • 58
    @FelipeAlvarez Correct. But that's how Linux works. Many small binaries that work well with each other. systemctl does what is asked, it lists services. There is no filtering command built-in to systemctl because grep already exists and can do that well with any program's output. It's how it's always been :)
    – Delorean
    Feb 16, 2017 at 16:01
  • 8
    I agree and so it should be. But, systemd already tries to do SO much that I wonder why it can't list enabled services? Feb 18, 2017 at 0:45
  • 7
    systemctl | grep running do not list anything to me! Even if something is running is only listed as for his status like: enabled, disabled, masked, static
    – Cirelli94
    Apr 13, 2017 at 10:34
  • 49
    Simpler: systemctl list-unit-files --state=running
    – Will
    Sep 2, 2017 at 10:40
191

man systemctl states:

--state=

The argument should be a comma-separated list of unit LOAD, SUB, or ACTIVE states. When listing units, show only those in the specified states. Use --state=failed to show only failed units.

Explanation:

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.

Though you can also use this to only show enabled units with:

systemctl list-unit-files --state=enabled

If a unit is enabled that means that the system will start it on startup. Though setting something to enabled doesn't actually also start it so you will need to do that manually, or reboot the system after setting it to enabled.

6
  • 11
    To enable and start at the same time: systemctl enable --now ...
    – Mmmh mmh
    Jul 29, 2017 at 20:24
  • 2
    --state=enabled has no effect on systemd version 215 (on Raspbian 8 Jessie), but it does work on systemd version 229 (on Ubuntu 16.04.03 Xenial).
    – mpb
    Dec 17, 2017 at 22:15
  • @mpb: But yet it works perfectly fine on version 235 on Arch Linux.
    – user364819
    Dec 17, 2017 at 23:07
  • You can also check --state=generated for generated unit files that might be running (the pihole-FTL service works this way, for example).
    – mgalgs
    Aug 26, 2021 at 17:24
  • 1. The answer lacks of a --type service to filter only that type of units. 2. @mgalgs list-unit-files now includes generated units Oct 29, 2021 at 7:18
100

To list all the systemd service which are in state=active and sub=running

systemctl list-units --type=service --state=running

To list all the systemd serice which are in state=active and sub either running or exited

systemctl list-units --type=service --state=active
1
  • --list-units show the service(s) if they are based on a template [email protected] +1
    – Mat M
    Mar 15, 2023 at 12:52
23

To see 'enabled' services including these that are still under upstart/init run:

systemctl list-unit-files --type service --state enabled,generated

To see all of the currently running services run:

systemctl list-units --type service --state running
3
  • Unfortunately the names of the services can be different in the two lists - e.g. sshd vs. ssh and syslog vs. rsyslog.
    – OrangeDog
    Jan 11, 2019 at 18:35
  • The only "non grep" right answer. Though not sure why upstart is mentioned...
    – rogerdpack
    Jul 5, 2019 at 16:53
  • list-unit-files now includes generated units Oct 29, 2021 at 7:20
15

There is a good GUI application called Stacer where you can manage all the services.

enter image description here

Check its Github link Stacer Github
Also check Web for more info

1
  • This is brilliant! I used this command to install on Debian/Unbuntu: sudo apt-get install stacer
    – SharpC
    Jan 10 at 16:29
11

Also overview of all active and failed services:

systemctl list-units --type service --state running,failed
6

In addition to the current answers, I use the following to get just the names of the services:

systemctl list-units --type=service --state=active,running | awk '/.*\.service/ {print $1}'

Rather than the tabular format, this makes it easier to pipe just those services to another program

2

What about systemctl unit templates?

To list also templated units, you might want to use:

systemctl list-units --all|grep yourservice

The --all switch shows also all units which have been instantiated with

systemctl <service_name>@<argument>.service

From the man page:

When listing units with list-units, also show inactive units and units which are following other units. When showing unit/job/manager properties, show all properties regardless whether they are set or not.

Example:

systemctl openvpn@my_office_endopoint.service

Further reading: https://fedoramagazine.org/systemd-template-unit-files/

1
  • 1
    The "--all" parameter was missing from other replies!
    – jehon
    Jul 6, 2022 at 13:59
2

This for me has been the fastest way to check my running or failed services that are supposed to be enabled. With this, I know I do not have to run:

sudo shutdown -r now

I just use most of the above with comma separation on state:

systemctl list-units --type=service --state=running,enabled,failed,generated
1

To list user otheruser's active user services:

sudo runuser -l otheruser-c "systemctl --user list-units --type=service --state=active"

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .