wsl.exe --terminate 之后进程是否有机会安全终止?
Do processes have a chance to terminate safely after wsl.exe --terminate?
当用户调用 wsl.exe --terminate
或 wslconfig.exe /t
终止 WSL 上的分发时,进程是否有机会安全终止?我还想了解 WSL2 和 WSL1 在这方面是否有任何区别。在 linux 上,我的理解是 shutdown(8)
向所有进程发送 SIGTERM
,这让它们有机会保存并干净地退出。通过终止命令在 WSL 中也是这种情况吗?
对于来到这里的任何人,似乎没有关于终止命令在幕后做什么的明确文档,但基于一些小实验,我认为它们不会向进程发送任何信号,并且行为是WSL1 和 WSL2 相同。
这里有一些示例代码来捕获 SIGTERM
(可以针对任何信号进行修改)。
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
static volatile sig_atomic_t sigterm_flag = 0;
static void sigterm_handler(int _)
{
(void)_;
sigterm_flag = 1;
}
int main(void)
{
signal(SIGTERM, sigterm_handler);
while (1) {
if (sigterm_flag) {
puts("Terminated by SIGTERM");
break;
}
sleep(1);
puts("Still running...");
}
return EXIT_SUCCESS;
}
我编译了它 运行 它。然后我从单独的 powershell 选项卡 运行 wsl.exe --terminate
或 wslconfig.exe /t
或 wsl --shutdown
。程序不会捕获任何信号,WSL 实例会直接退出。使用 kill
直接发送信号按预期工作并在退出前打印捕获的信号。
如果有人能阐明您调用 --terminate
时实际发生的情况,那将很有用。另外,感谢 this post 的帮助。
当用户调用 wsl.exe --terminate
或 wslconfig.exe /t
终止 WSL 上的分发时,进程是否有机会安全终止?我还想了解 WSL2 和 WSL1 在这方面是否有任何区别。在 linux 上,我的理解是 shutdown(8)
向所有进程发送 SIGTERM
,这让它们有机会保存并干净地退出。通过终止命令在 WSL 中也是这种情况吗?
对于来到这里的任何人,似乎没有关于终止命令在幕后做什么的明确文档,但基于一些小实验,我认为它们不会向进程发送任何信号,并且行为是WSL1 和 WSL2 相同。
这里有一些示例代码来捕获 SIGTERM
(可以针对任何信号进行修改)。
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
static volatile sig_atomic_t sigterm_flag = 0;
static void sigterm_handler(int _)
{
(void)_;
sigterm_flag = 1;
}
int main(void)
{
signal(SIGTERM, sigterm_handler);
while (1) {
if (sigterm_flag) {
puts("Terminated by SIGTERM");
break;
}
sleep(1);
puts("Still running...");
}
return EXIT_SUCCESS;
}
我编译了它 运行 它。然后我从单独的 powershell 选项卡 运行 wsl.exe --terminate
或 wslconfig.exe /t
或 wsl --shutdown
。程序不会捕获任何信号,WSL 实例会直接退出。使用 kill
直接发送信号按预期工作并在退出前打印捕获的信号。
如果有人能阐明您调用 --terminate
时实际发生的情况,那将很有用。另外,感谢 this post 的帮助。