How to know if I am using systemd on Linux?

28,950

Solution 1

I know this is an old question, but since I was just asking myself the same question - here are my 2ct.

Best solution I came up with

ps --no-headers -o comm 1

This returns either systemd or init and appears reliable across Linux distributions and releases.

file /sbin/init would work, with help of pattern matching. Output of ps 1 does not appear helpful since on some Linux distributions it will print 'init' (the symlink) despite systemd being used.

Debian 8

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:02 /sbin/init
$ file /sbin/init
/sbin/init: symbolic link to /lib/systemd/systemd

RHEL 7

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     7:46 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
$ file /sbin/init
/sbin/init: symbolic link to `../lib/systemd/systemd'

SLES 12

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:24 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
$ file /sbin/init
/sbin/init: symbolic link to `../usr/lib/systemd/systemd'

openSUSE 13.1

$ ps 1
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:33 /sbin/init showopts
$ /sbin/init: symbolic link to `../usr/lib/systemd/systemd'

Solution 2

Check what process is running as PID 1. You can do this by running ps 1 and scrolling to the top. If you have some systemd thing running as PID 1, you have systemd running.

Alternatively, run systemctl to list running systemd units.

You might also want to check what /sbin/init is; file /sbin/init will tell you if it's a real executable or if it's a symbolic link to some other package's executable. On a systemd box, for example:

root@boxy / # file /sbin/init
/sbin/init: symbolic link to ../lib/systemd/systemd

For more information, check this out: https://en.wikipedia.org/wiki/Linux_startup_process

Another way of seeing exactly what you have on your system is typing man init and seeing which program's man page you end up on.

Solution 3

The correct solution is to check the presence of /run/systemd/system directory.

[[ -d /run/systemd/system ]] && echo "using systemd" 

This method is used by systemd's own library function sd_booted(): https://www.freedesktop.org/software/systemd/man/sd_booted.html

Share:
28,950

Related videos on Youtube

Lucho
Author by

Lucho

Just a techie.

Updated on September 18, 2022

Comments

  • Lucho
    Lucho over 1 year

    How could I know if my linux starts with systemd or whatever package?

    • Trevor Boyd Smith
      Trevor Boyd Smith over 6 years
      on rpm distros, rpm --quiet --query systemd. this avoids the hanky panky involved in looking for a process or pid or symlink.
    • Trevor Boyd Smith
      Trevor Boyd Smith over 6 years
  • deltab
    deltab over 8 years
    An easier way to see what's running with pid 1 is ps 1 (the number 1).
  • ecube
    ecube over 8 years
    @deltab Thanks for clearing that up! I'll edit it into the answer.
  • Lucho
    Lucho over 8 years
    Great guys(@deltab,@dma1324)!!! My ps 1 shows /sbin/init, and my file /sbin/init shows a binary, so I think it's not systemd. Then I have tried to run the systemctl command and get the "command not found" error, so now I'm sure I have not systemd on my linux.
  • iconoclast
    iconoclast over 3 years
    THIS is the best answer!
  • Christopher Oezbek
    Christopher Oezbek about 3 years
    Thanks for the downvote. But this works for me.
  • Maxim V. Pavlov
    Maxim V. Pavlov over 2 years
    So Microsoft is shipping Ubuntu as part of WSL 2. On it, the systemctl command isn't available, not DBus bindings of Systemd are available, but some of the solutions proposed here literally report "systemd". But even MS confirms it is not systemd they are using in their "Ubuntu". This solution actually reveals the difference. For WSL 2 Ubuntu it returns init, on real Ubuntu it returns "systemd". Thanks for the answer.
  • dbernard
    dbernard about 2 years
    Using '-d' instead of '-x' would be a bit more accurate. Prevents potential confusion about an executable file vs a directory.
  • intgr
    intgr about 2 years
    Updated my answer to use -d. I originally intended to use -e but got the options mixed up. These shouldn't make any difference in practice.