我使用 WSL 在 Windows 中运行 Ubuntu。当我使用 systemctl 命令运行脚本时收到以下错误:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
您知道我可以在 WSL 中运行以下 systemctl 命令的等效命令是什么吗?
systemctl daemon-reload
systemctl reset-failed
答案1
没有等效命令。WSL(1 和 2)不运行任何 init 系统,如 Systemd、OpenRC 等。WSL 2 发行版作为“容器”运行,这些容器与 Docker 容器非常相似。如果我们忽略管道,它们只会在您打开终端时启动 shell 实例。
您可以在 WSL 2 内部运行嵌套容器(例如使用systemd-nspawn
),然后可以运行 Systemd(或任何其他可能需要 PID 1 的东西)。
根据您要执行的操作,完整的虚拟机可能是一个更合适的解决方案。
答案2
重复使用我的以下一些询问 Ubuntu 答案,但您询问的命令完全不同,所以我会稍微修改一下这个答案。不过,您可能还想阅读 Ask Ubuntu 答案以获取更多信息。
问题
一般来说,当你看到任何一个以下两条消息:
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
(以及其他一些)
那么其根本原因通常都是相同的。
核心问题是 WSL 不使用 Systemd,即使在 Ubuntu(以及大多数其他发行版)中也是如此,它是默认设置。相反,WSL 目前使用自己的/init
进程作为 PID 1,它执行一些我在这个答案(所以我不会在这里重复)。
您特别提到的命令是重新加载Systemd 单元。由于 WSL 下没有运行 Systemd 单元,因此尝试重新加载它们实际上没有什么意义。
我在这里猜测,但我认为你正在尝试重新加载因为有些你期望运行的单元/服务没有运行。当然,这是因为 Systemd 没有运行。
有关如何在 WSL 上的 Ubuntu 下启动服务的信息,请参阅链接的答案。
我没有在那个特定的答案中提到关于进程监控的一般内容(daemon-reload
适用reset-failed
于)。如果你确实想要在 Ubuntu 上进行一些基本的进程监控,我建议你查看主管。它可以轻松安装在 Ubuntu 上(不像其他一些兼作系统的进程管理器init
)。您必须创建自己的配置,但对于大多数服务来说,语法相当简单。