来自 bash 的便携式守护进程管理(sysvinit/upstart/systemd)

Dha*_*lan 1 bash upstart init.d systemd

我有一个需要停止服务的小 shell 脚本。这需要在 ubuntu (14.04)、debian 和 Arch 上工作。现在我所做的类似于

   case $(cat /etc/issue) 在 
     *Ubuntu*)
       服务命令
     *Debian*)
       /etc/init.d/servicename 命令
     *拱*)
       systemctl 服务命令
   esac

有没有更好的方法来做到这一点?

Stu*_*ley 5

我会说不要查看当前的发行版来确定使用哪个 init 系统来管理守护进程:

  • 确定发行版有点模糊(如丹尼斯的回答中所述)
  • 使用的 init 系统在发行版的不同版本之间发生变化(正如 Michael Hampton 所指出的,大牌发行版都倾向于 systemd;Ubuntu 目前是一个大牌的坚持者,他们计划在 2016 年之前切换)。
  • init 系统可能会在单个安装上从默认值更改(从今年 10 月的 14.10 Utopic Unicorn 开始,一些 Ubuntu 安装可能会选择提前切换到 systemd)。

虽然这不是万无一失的(一个系统可能会选择安装多个彼此并排的 init 系统),但我这样做的方法是寻找工具本身的存在

if command -v systemctl >/dev/null; then
  # assume systemd
  systemctl $command $servicename
elif command -v initctl >/dev/null; then
  # assume upstart
  initctl $command $servicename
elif command -v service >/dev/null; then
  # assume old Debian `service` utility
  service $servicename $command

# ... elif cases for any other utils you'd want to check for ...

else
  # assume bare init.d scripts
  /etc/init.d/$servicename $command
fi
Run Code Online (Sandbox Code Playgroud)

This answer to a similar question描述了一些进一步的启发式方法,您可以使用它来确定当前使用的初始化系统,用于不够准确的情况。

但最终,没有一种方法可以真正检测安装“使用”哪个 init 系统 - 可以创建每次启动时在 init 系统之间切换的设置。