检查系统是否在 BASH 中使用 systemd 或 sysvinit 的便捷方法?

pho*_*ops 53 linux scripting systemd sysvinit

我正在定义要在不同发行版中使用的通用 bash 文件。我需要一种方法来检查系统是使用 systemd 还是 sysvinit (/etc/init.d/)。我需要这个,所以我运行适当的命令来启动服务。检查这个的安全方法是什么?我目前检查 systemctl 命令是否存在,但这真的是一个选项,因为可能存在 systemctl 命令可用的情况,但这并不一定意味着实际使用了 systemd?

这是我当前 bash 脚本的摘录:

#!/bin/sh
if [ command -v systemctl >/dev/null ]
then
    systemctl service start
else
    /etc/init.d/service start
fi
Run Code Online (Sandbox Code Playgroud)

小智 52

Systemd 和 init 有 pid = 1

pidof /sbin/init && echo "sysvinit" || echo "other"
Run Code Online (Sandbox Code Playgroud)

检查 systemd

pidof systemd && echo "systemd" || echo "other"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 第一个解决方案是错误的,因为 `/sbin/init` 可能是到 `/lib/systemd/systemd` 的符号链接。要检查它运行 [`file /sbin/init`](http://linux.die.net/man/1/file)。 (33认同)
  • 判断 `systemd` 是否正在管理系统的正确方法[是检查 `/run/systemd/system` 是否存在](https://www.freedesktop.org/software/systemd/man/sd_booted.html )。 (12认同)
  • +1 表示 `pstree -p`,-1 表示本答案的其余部分。 (11认同)
  • -1 用于误导性的 `pidof init`,因为它可能是到 `systemd` 的符号链接。+1 为这里的评论提供了足够多的答案来帮助来到这里的人。尝试例如:`[[ -L "/sbin/init" ]] && echo 'systemd' || 回声'systemV'` (7认同)
  • 那_not_什么时候会回显`sysvinit`?AFAIK,所有(或大多数)初始化系统的 PID 为 1,这是定义的一部分。 (5认同)