我怎么知道我的 Linux 是否以systemd
什么包启动?
答案1
我知道这是一个老问题,但因为我刚刚问了自己同样的问题——这是我的 2ct。
我想到的最佳解决方案
ps --no-headers -o comm 1
这将返回systemd
或,init
并且在 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
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'
答案2
检查哪个进程以 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
欲了解更多信息,请查看:https://en.wikipedia.org/wiki/Linux_startup_process
查看系统中具体内容的另一种方法是输入man init
并查看最终进入哪个程序的手册页。
答案3
这正确的解决方案是检查/run/systemd/system
目录是否存在。
[[ -d /run/systemd/system ]] && echo "using systemd"
此方法是使用systemd自己的库函数sd_booted()
:https://www.freedesktop.org/software/systemd/man/sd_booted.html
答案4
到目前为止,我发现的最佳答案是询问发行版的包管理器哪个包安装了 /sbin/init 文件。例如,在基于 debian 的发行版中,这将是
dpkg -S /sbin/init
如果/sbin/init
您的系统上不存在该程序,您可以使用 来查找 pid 1 的程序ps 1
。