本文主要介绍在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遭到损坏或者配置有错误。
解决方案
远程连接Linux实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
执行以下命令,确认系统是否使用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服务。