因此,我在 Windows 10 上运行我的 wsl,当我输入:
sudo -u root init 0 我收到错误:
Couldn't find an alternative telinit implementation to spawn.
Neofetch(无标志或参数):
_,met$$$$$gg. linx@win64
,g$$$$$$$$$$$$$$$P. --------------------------
,g$$P" """Y$$.". OS: Debian GNU/Linux 11 (bullseye) on Windows 10 x86_64
,$$P' `$$$. Kernel: 5.10.102.1-microsoft-standard-WSL2
',$$P ,ggs. `$$b: Uptime:------------
`d$$' ,$P"' . $$$ Packages: 245 (dpkg)
$$P d$' , $$P Shell: bash 5.1.4
$$: $$. - ,d$$' Terminal: /dev/pts/1
$$; Y$b._ _,d$P' CPU: Intel i5-8250U (8) @ 1.799GHz
Y$$. `.`"Y$$$$P"' Memory: 99MiB / 6225MiB
`$$b "-.__
`Y$$
`Y$$.
`$$b.
`Y$$b.
`"Y$b._
`"""
当我尝试时也会发生同样的事情:
su root
然后再试一次
答案1
我假设您正在尝试使用telinit 0
(以 root 身份)关闭 WSL 下的 Debian。由于以下几个原因,这根本行不通:
尽管被命名为
/init
,WSL 的 init 进程并不是具有运行级别概念的 SysV Init。在 Debian 下,无论如何
telinit
都是 Systemd 的符号链接。从Debian 下的手册页来看:systemctl
telinit
由于 SysV 运行级别的概念已经过时,运行级别请求将被透明地转换为 systemd 单元激活请求
这也行不通,因为 WSL 不支持 Systemd,除非进行额外的配置(通常不推荐)。请参阅这个 Ask Ubuntu 问题和这个超级用户问题了解更多详情。
在 WSL 下运行 Debian 与在 Docker 容器中运行 Debian 非常相似(参考Windows WSL2“发行版”只是底层的 Docker 容器吗?在 SU 上)。容器内部没有“关闭”的概念。这需要从主机(WSL 本身)进行处理。
因此也许有两个真实的您问题中没有问到的问题:
如何在 WSL 下关闭 Debian?
您有两个选择。首先,您可以使用 终止一个特定的发行版
wsl --terminate <distroname>
(可能wsl --terminate debian
对您而言)。或者,您可以使用 终止所有发行版和托管主机 VM(在 WSL2 下,您通常无法“看到”)wsl --shutdown
。您甚至可以使用 从 Debian 内部运行它
wsl.exe --shutdown
。但请注意,这是不是“干净”关闭。内部进程不会提前收到通知,也不会有机会使用 进行“清理”
SIGTERM
。这引出了下一个问题...如何在 WSL 下安全地关闭 Debian 中的进程?
这并不像我想的那么容易。但如果没有 WSL 机制本身可以依赖,最好的选择可能是使用进程/服务管理器来启动和管理您需要安全关闭的任何进程。
我曾成功导师过去。您可以设置它来启动、管理、查询、停止(等等)服务。
如果你在 Supervisor 下运行所有服务,那么你实际上可以通过以下方式关闭 WSL 下的 Debian:
wsl -u root -e supervisorctl stop all
一旦 Debian 内部的所有进程都终止,WSL 将在 15 秒后自动终止实例。再过 10 秒(默认情况下),然后 WSL2 将“关闭”虚拟机本身。