WSL 下的 systemctl 命令

WSL 下的 systemctl 命令

我使用 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)。您必须创建自己的配置,但对于大多数服务来说,语法相当简单。

相关内容