如何知道我是否在 Linux 上使用 systemd?

Luc*_*cho 19 linux boot init systemd

我怎么知道我的 linux 是从systemd什么包开始的?

ecu*_*ube 24

检查哪个进程作为 PID 1 运行。您可以通过运行ps 1并滚动到顶部来执行此操作。如果你有一些 systemd 的东西作为 PID 1 运行,那么你已经在运行 systemd。

或者,运行systemctl以列出正在运行的 systemd 单元。

您可能还想检查 /sbin/init 是什么;file /sbin/init会告诉你它是一个真正的可执行文件还是一个指向其他包的可执行文件的符号链接。在 systemd 盒子上,例如:

root@boxy / # file /sbin/init
/sbin/init: symbolic link to ../lib/systemd/systemd
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看:https : //en.wikipedia.org/wiki/Linux_startup_process

准确查看系统上的内容的另一种方法是键入man init并查看您最终访问的是哪个程序的手册页。

  • 查看使用 pid 1 运行的内容的更简单方法是 `ps 1`(数字 1)。 (2认同)

小智 21

我知道这是一个老问题,但因为我只是问自己同样的问题 - 这是我的 2ct。

我想出的最佳解决方案

ps --no-headers -o comm 1
Run Code Online (Sandbox Code Playgroud)

这将返回systemdinit并且在 Linux 发行版和发行版中显得可靠。

file /sbin/init在模式匹配的帮助下会起作用。的输出ps 1似乎没有帮助,因为在某些 Linux 发行版上,尽管使用了 systemd,它仍会打印“init”(符号链接)。

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
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

  • 因此,Microsoft 将 Ubuntu 作为 WSL 2 的一部分提供。在 Ubuntu 上,systemctl 命令不可用,Systemd 的 DBus 绑定不可用,但此处提出的一些解决方案字面上报告“systemd”。但即使是 MS 也确认他们在“Ubuntu”中使用的不是 systemd。这个解决方案实际上揭示了差异。对于 WSL 2 Ubuntu,它返回 init,在真正的 Ubuntu 上,它返回“systemd”。感谢你的回答。 (2认同)

int*_*tgr 12

正确解决方案是检查/run/systemd/system目录是否存在。

[[ -d /run/systemd/system ]] && echo "using systemd" 
Run Code Online (Sandbox Code Playgroud)

该方法由systemd自己的库函数使用sd_booted()https://www.freedesktop.org/software/systemd/man/sd_booted.html