Ubuntu
我在 Windows 10 上使用带有 WSL2( ) 的经典 LAMP 开发环境。
我想在完成工作后关闭 WSL2 以便能够释放资源(Vmmem 进程可能消耗资源)。
我可以安全地关闭 WSL2(wsl --shutdown
)而不停止 mysql 和 apache 等服务吗?或者我应该在关闭 WSL2 之前手动停止它们?
这有关系吗?有什么好的做法吗?或者会出问题吗?我不想搞砸我的环境(数据库或 Apache 等)。
答案1
我不想搞砸我的环境(数据库或 apache 等)
为了安全起见,您应该先关闭这些服务。
您应该能够编写一个小批处理文件,以正确的顺序关闭所有内容。
答案2
wsl --terminate <distro>
我已经对和进行了一些有限的测试(见下文)wsl --shutdown
,并且确实不是似乎SIGTERM
向子进程发送一个(或任何其他信号)以允许它们安全终止。
正如@DavidPostill 在他的回答,我同意你应该确保首先安全地终止这些服务。
选择
作为编写自己的脚本的替代方法,我建议在进程管理器(如恰当命名的)下启动这些服务导师. 完成上述操作后,您可以发出一个命令sudo supervisorctl stop all
来安全地终止(通过默认SIGTERM
)所有相关服务。
有限的测试说明
我在这里进行的快速而粗略的测试涉及使用 Fish shell(可能是 Bash 或其他,但这是我首选的 shell)来注册信号处理程序。
首先,我做了:
function exit_test --on-event fish_exit
touch ~/exiting
end
然后,我从同一个 Ubuntu 发行版/实例中的另一个 (Bash) shell 运行:
pkill -SIGTERM fish
这确实不是触发该函数,因为~/exiting
尚未创建,但它Terminated
在退出之前确实从 Fish 本身生成了一条消息。
同样地:
pkill -SIGKILL fish
...Killed
从 Fish 生成了一条消息,但没有~/exited
创建文件。
pkill -SIGHUP fish
记住:不SIGHUG
...
这做过生成~/exiting
,但终端上没有消息。
另一方面,从 PowerShell 来看:
wsl --terminate Ubuntu-22.04
... 没有在终端上从 Fish 生成任何消息,也没有生成文件~/exiting
。
接下来,我为 Fish 中的大多数信号创建了一个陷阱:
for signal in $(string split ' ' $(trap -l))
if ! contains $signal "POLL" "STKFLT" "CHLD"
trap "echo $signal >> ~/signals" $signal
end
end
我排除了POLL
和,STKFLT
因为 Fish 不允许我在它们上面创建陷阱。我排除了,CHLD
因为只要子进程结束(几乎每次提示,然后是其他提示),它就会触发。
完整的被捕获信号列表如下:
> trap -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT
CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS
基于此,我重新进行了上述测试。
pkill -SIGTERM fish
pkill -SIGHUP fish
pkill -SIGINT fish
pkill -SIGUSR1 fish
... etc.
全部正确触发陷阱并将相应信号写入~/signals
。请注意,由于trap
,shell 不会退出。
pkill -SIGKILL fish
再次生成一条Killed
消息,并且(正如预期的那样)没有触发陷阱。
wsl --shutdown
# or
wsl --terminate Ubuntu-22.04
做过不是触发任何陷阱或消息。
基于此,我认为 WSL 不会发送任何终止或关闭时向子进程发出信号。