How to Manage ‘Systemd’ Services and Units Using ‘Systemctl’ in Linux

CPU Utilization (Shares) of a Service

25. Get the current CPU Shares of a Service (say httpd).

# systemctl show -p CPUShares httpd.service

CPUShares=1024

Note: The default each service has a CPUShare = 1024. You may increase/decrease the CPU share of a process.

26. Limit the CPU Share of a service (httpd.service) to 2000 CPUShares/

# systemctl set-property httpd.service CPUShares=2000
# systemctl show -p CPUShares httpd.service

CPUShares=2000

Note: When you set CPUShare for a service, a directory with the name of service is created (httpd.service.d) which contains a file 90-CPUShares.conf which contains the CPUShare Limit information. You may view the file as:

# vi /etc/systemd/system/httpd.service.d/90-CPUShares.conf 

[Service]
CPUShares=2000        

27. Check all the configuration details of a service.

# systemctl show httpd

Id=httpd.service
Names=httpd.service
Requires=basic.target
Wants=system.slice
WantedBy=multi-user.target
Conflicts=shutdown.target
Before=shutdown.target multi-user.target
After=network.target remote-fs.target nss-lookup.target systemd-journald.socket basic.target system.slice
Description=The Apache HTTP Server
LoadState=loaded
ActiveState=active
SubState=running
FragmentPath=/usr/lib/systemd/system/httpd.service
....

28. Analyze critical chain for a service (httpd).

# systemd-analyze critical-chain httpd.service

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.

httpd.service +142ms
└─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\x2d85d196080964.service @4.092s +149ms
                              └─dev-disk-by\x2duuid-79f594ad\x2da332\x2d4730\x2dbb5f\x2d85d196080964.device @4.092s

29. Get a list of dependencies for a service (httpd).

# systemctl list-dependencies httpd.service

httpd.service
├─system.slice
└─basic.target
  ├─firewalld.service
  ├─microcode.service
  ├─rhel-autorelabel-mark.service
  ├─rhel-autorelabel.service
  ├─rhel-configure.service
  ├─rhel-dmesg.service
  ├─rhel-loadmodules.service
  ├─paths.target
  ├─slices.target
  │ ├─-.slice
  │ └─system.slice
  ├─sockets.target
  │ ├─dbus.socket
....

30. List control groups hierarchically.

# systemd-cgls

├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
├─user.slice
│ └─user-0.slice
│   └─session-1.scope
│     ├─2498 sshd: root@pts/0    
│     ├─2500 -bash
│     ├─4521 systemd-cgls
│     └─4522 systemd-cgls
└─system.slice
  ├─httpd.service
  │ ├─4440 /usr/sbin/httpd -DFOREGROUND
  │ ├─4442 /usr/sbin/httpd -DFOREGROUND
  │ ├─4443 /usr/sbin/httpd -DFOREGROUND
  │ ├─4444 /usr/sbin/httpd -DFOREGROUND
  │ ├─4445 /usr/sbin/httpd -DFOREGROUND
  │ └─4446 /usr/sbin/httpd -DFOREGROUND
  ├─polkit.service
  │ └─721 /usr/lib/polkit-1/polkitd --no-debug
....

31. List control group according to CPU, memory, Input, and Output.

# systemd-cgtop

Path                                                              Tasks   %CPU   Memory  Input/s Output/s

/                                                                    83    1.0   437.8M        -        -
/system.slice                                                         -    0.1        -        -        -
/system.slice/mariadb.service                                         2    0.1        -        -        -
/system.slice/tuned.service                                           1    0.0        -        -        -
/system.slice/httpd.service                                           6    0.0        -        -        -
/system.slice/NetworkManager.service                                  1      -        -        -        -
/system.slice/atop.service                                            1      -        -        -        -
/system.slice/atopacct.service                                        1      -        -        -        -
/system.slice/auditd.service                                          1      -        -        -        -
/system.slice/crond.service                                           1      -        -        -        -
/system.slice/dbus.service                                            1      -        -        -        -
/system.slice/firewalld.service                                       1      -        -        -        -
/system.slice/lvm2-lvmetad.service                                    1      -        -        -        -
/system.slice/polkit.service                                          1      -        -        -        -
/system.slice/postfix.service                                         3      -        -        -        -
/system.slice/rsyslog.service                                         1      -        -        -        -
/system.slice/system-getty.slice/[email protected]                   1      -        -        -        -
/system.slice/systemd-journald.service                                1      -        -        -        -
/system.slice/systemd-logind.service                                  1      -        -        -        -
/system.slice/systemd-udevd.service                                   1      -        -        -        -
/system.slice/webmin.service                                          1      -        -        -        -
/user.slice/user-0.slice/session-1.scope                              3      -        -        -        -

Control System Runlevels

32. How to start a system rescue mode.

# systemctl rescue

Broadcast message from root@tecmint on pts/0 (Wed 2015-04-29 11:31:18 IST):

The system is going down to rescue mode NOW!

33. How to enter into emergency mode.

# systemctl emergency

Welcome to emergency mode! After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" to try again
to boot into default mode.

34. List current run levels in use.

# systemctl get-default

multi-user.target

35. How to start Runlevel 5 aka graphical mode.

# systemctl isolate runlevel5.target
OR
# systemctl isolate graphical.target

36. How to start Runlevel 3 aka multiuser mode (command line).

# systemctl isolate runlevel3.target
OR
# systemctl isolate multiuser.target

36. How to set multiuser mode or graphical mode as default run level.

# systemctl set-default runlevel3.target

# systemctl set-default runlevel5.target

37. How to reboot, halt, suspend, hibernate, or put a system in hybrid-sleep.

# systemctl reboot

# systemctl halt

# systemctl suspend

# systemctl hibernate

# systemctl hybrid-sleep

For those who may not be aware of run levels and what it does.

  1. Runlevel 0 : Shut down and Power off the system.
  2. Runlevel 1 : Rescue?Maintainance Mode.
  3. Runlevel 3 : multiuser, no-graphic system.
  4. Runlevel 4 : multiuser, no-graphic system.
  5. Runlevel 5 : multiuser, graphical system.
  6. Runlevel 6 : Shutdown and Reboot the machine.

That’s all for now. Keep connected! Keep commenting. Don’t forget to provide us with your valuable feedback in the comments below. Like and share us and help us get spread.

Avishek
A Passionate GNU/Linux Enthusiast and Software Developer with over a decade in the field of Linux and Open Source technologies.

Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.

Join the TecMint Weekly Newsletter (More Than 156,129 Linux Enthusiasts Have Subscribed)
Was this article helpful? Please add a comment or buy me a coffee to show your appreciation.

25 thoughts on “How to Manage ‘Systemd’ Services and Units Using ‘Systemctl’ in Linux”

  1. 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

    Reply
    • 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?

      Reply
  2. 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.

    # ps -eaf | grep [s]ystemd
    

    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

    The system has not been booted with systemd as an init system (PID 1). Can't operate.
    Failed to create bus connection: Host is down `.
    

    I will be very thankful and appreciate a lot if someone here can bail me out of it?
    TIA

    Reply
    • 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?

      Reply
    • @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.

      Reply
  3. 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.

    Reply
  4. 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

    Reply
  5. 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.

    Reply
    • @Frank,

      Thanks for appreciating our work and giving us valuable tip, we’ve will check and add to the list as per your suggestions.

      Reply
      • 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.

        Reply
  6. 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?

    Reply
    • @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..

      Reply
      • 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

        Reply
        • 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.

          Reply

Leave a Reply to Frank Cancel reply

Thank you for taking the time to share your thoughts with us. We appreciate your decision to leave a comment and value your contribution to the discussion. It's important to note that we moderate all comments in accordance with our comment policy to ensure a respectful and constructive conversation.

Rest assured that your email address will remain private and will not be published or shared with anyone. We prioritize the privacy and security of our users.