在Linux实例中执行systemctl命令报错怎么办?

本文主要介绍在Linux实例中执行systemctl命令报错的可能原因和解决方案。

问题描述

在Linux系统实例中执行systemctl命令出现类似如下报错:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to get D-Bus connection: xxx xxx.

可能原因

systemd是一个初始化系统和服务管理器,用于初始化Linux系统上的进程,以及管理它们的生命周期。systemctl是systemd系统和服务管理器的命令行工具。如果您出现问题描述中的错误,可能原因如下:

  • 系统没有使用systemd初始化。

    • 一些较老的Linux发行版或者某些轻量级发行版(如Devuan、Alpine Linux或Void Linux)可能默认使用其他初始化系统(如OpenRC、SysVinit或runit),而不是systemd。比如,Windows Subsystem for Linux (WSL)默认情况下使用SysVinit初始化系统而不是systemd。

    • 如果您在一个像Docker或Podman这样的容器内部执行命令,而该容器未配置为使用systemd作为初始化系统,您可能会遇到这个错误。

  • 系统使用了systemd初始化,但systemd遭到损坏或者配置有错误。

解决方案

  1. 远程连接Linux实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 执行以下命令,确认系统是否使用systemd初始化。

    ps -p 1 -o comm=
    • 输出结果为空或者其他值:表示系统没有使用systemd进行初始化,请使用与当前初始化系统相对应的服务管理命令。

      说明

      如果您需要使用systemctl相关脚本执行应用程序,建议使用其他支持systemd的Linux发行版或在Docker容器中运行支持systemd的Linux系统。

      例如,如果系统使用SysVinit(输出为init),可使用service命令代替systemctl。常见命令对照如下表所示:

      服务操作\命令

      SysVinit

      Systemd

      启动服务

      sudo service service_name start

      sudo systemctl start service_name

      停止服务

      sudo service service_name stop

      sudo systemctl stop service_name

      重启服务

      sudo service service_name restart

      sudo systemctl restart service_name

      检查服务状态

      sudo service service_name status

      sudo systemctl status service_name

      启用服务的自启动

      sudo chkconfig service_name on

      sudo systemctl enable service_name

      关闭服务的自启动

      sudo chkconfig service_name off

      sudo systemctl disable service_name

    • 输出结果为systemd:表示系统已通过systemd进行初始化。如果问题仍然存在,则可能是由于系统损坏或配置错误造成的。建议您根据相应发行版的官方指南,尝试恢复systemd服务。