本文主要介紹在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服務。