我Ubuntu
在 Windows 10 上使用带有 WSL2() 的经典 LAMP 开发环境。
我想在完成工作后关闭 WSL2 以便能够释放资源(Vmmem 进程可能会消耗资源)。
我可以wsl --shutdown
在不停止 mysql 和 apache 等服务的情况下安全地关闭 WSL2 ( ),还是应该在关闭 WSL2 之前手动停止它们?
有关系吗?有什么好的做法或者可能会出错吗?我不想搞砸我的环境(数据库或 apache 等)
我Ubuntu
在 Windows 10 上使用带有 WSL2() 的经典 LAMP 开发环境。
我想在完成工作后关闭 WSL2 以便能够释放资源(Vmmem 进程可能会消耗资源)。
我可以wsl --shutdown
在不停止 mysql 和 apache 等服务的情况下安全地关闭 WSL2 ( ),还是应该在关闭 WSL2 之前手动停止它们?
有关系吗?有什么好的做法或者可能会出错吗?我不想搞砸我的环境(数据库或 apache 等)
为了安全起见,您应该首先关闭这些服务。
您应该能够编写一个小批处理文件,以正确的顺序关闭所有内容。
我已经用 and 做了一些有限的测试(见下文)
wsl --terminate <distro>
,wsl --shutdown
它似乎没有向子进程发送SIGTERM
(或任何其他信号)以允许它们安全终止。正如@DavidPostill 在他的回答中提到的那样,我同意您应该确保首先安全地终止这些服务。
选择
作为提供自己的脚本来执行此操作的替代方法,我建议在流程主管(如(恰当命名的)主管)下启动这些服务。有了它,您可以发出一个
sudo supervisorctl stop all
安全终止(通过默认值SIGTERM
)所有相关服务的问题。有限的测试说明
我在这里的快速而肮脏的测试涉及使用 Fish shell(可能是 Bash 或其他东西,但这是我的首选 shell)来注册信号处理程序。
首先,我做了一个:
然后,我从同一个 Ubuntu 发行版/实例中的另一个(Bash)shell 运行:
这并没有触发该函数,因为
~/exiting
它没有被创建,但它Terminated
在退出之前确实从 Fish 本身生成了一条消息。同样地:
Killed
...从 Fish生成一条消息,但没有~/exited
创建文件。自我提醒:不是
SIGHUG
……这确实生成
~/exiting
了,但终端上没有消息。另一方面,来自 PowerShell:
... 没有从终端上的 Fish 生成任何消息,也没有生成
~/exiting
文件。接下来,我为 Fish 中的大多数信号创建了一个陷阱:
我排除了
POLL
,STKFLT
因为鱼不会让我在他们身上制造陷阱。我排除CHLD
了,因为它会在子流程结束时触发(几乎是每个提示,然后是一些提示)。对于被捕获的信号的完整列表:
基于此,我重新进行了上述测试。
都正确触发了陷阱,并将相应的信号写入
~/signals
. 请注意,由于trap
,shell 不会退出。同样,生成了一条
Killed
消息,并且(如预期的那样)没有触发陷阱。没有触发任何陷阱或消息。
基于此,在我看来,WSL在终止或关闭时不会向子进程发送任何信号。