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