Bash 从WSL会话内部关闭或重新启动WSL会话
我希望能够重新启动WSL会话。这样做有点尴尬,因为WSL不使用systemd,所以我们不能使用Bash 从WSL会话内部关闭或重新启动WSL会话,bash,powershell,windows-subsystem-for-linux,Bash,Powershell,Windows Subsystem For Linux,我希望能够重新启动WSL会话。这样做有点尴尬,因为WSL不使用systemd,所以我们不能使用重新启动。在WSL会话中,我们可以运行任何Windows可执行文件: boss@Asus: ~ $ wsl.exe -l -v NAME STATE VERSION * Ubuntu-20.04 Running 2 fedoraremix Stopped 1 Alpine Stopped
重新启动
。在WSL会话中,我们可以运行任何Windows可执行文件:
boss@Asus: ~ $ wsl.exe -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
fedoraremix Stopped 1
Alpine Stopped 1
Ubuntu Stopped 1
因此,我们可以使用wsl.exe
(您必须确保在调用Windows命令时始终添加.exe
,否则它们将不起作用)关闭当前运行的wsl会话wsl.exe-t Ubuntu-20.03
,但问题是我不知道会话名称
当我们在WSL会话中时,hostname
是不同的,因此我不知道如何找到我所在的当前正在运行的会话的名称(可能是一个Windows进程命令,它告诉我从哪个进程运行??)
理想情况下,我希望命令等同于重新启动。我想这应该是这样的:
- 运行一个异步命令,该命令将在未来5-10秒内启动一个新会话,以允许上一个会话完全关闭(并且在该会话终止时不会终止)
- 使用
终止当前正在运行的会话wsl.exe-t
- 几秒钟后,新会话将启动
cd /mnt/c/ && cmd.exe /c start "rebooting WSL" cmd /c "timeout 5 && wsl -d $WSL_DISTRO_NAME" && wsl.exe --terminate $WSL_DISTRO_NAME
说明:
- 从Windows的角度来看,WSL系统是作为网络资源装载的
不支持生成的UNC路径格式,如cmd
。因此,在执行之前,最好将\\wsl$\Debian\
保存到它可以解析为Windows路径的目录中,例如cd
。如果ommited,cmd将投诉并将其目录更改为C:\
的cmd
%windir%
在linux和windows中完成前一个命令后运行另一个命令&&
cmd
启动一个cmd.exe/c
实例,并告诉它执行下面的命令cmd
是一个start”“…
-内部命令,用于在自己的窗口内运行另一个程序,与cmd
实例无关。在这种情况下,程序是另一个cmd
窗口WSL关闭时不会受到影响。cmd
- 在原来的Linux终端中,第一个
命令已经完成,cmd/c
之后的第三个命令关闭客户机,如上所述&&
- 第二个
窗口等待几秒钟,然后启动同一台WSL机器的新WSL会话cmd
bash
用户,编辑~/.bashrc
文件,然后应用更改:
nano ~/.bashrc && source ~/.bashrc
在文件中的任意位置添加下面的一行或两行
你当然可以选择任何你想要的名字。shutdown
和reboot
都作为systemd命令存在,但由于它们在WSL机器中不起作用,您可以用别名替换它们,如下所示:
alias shutdown='wsl.exe --terminate $WSL_DISTRO_NAME'
alias reboot='cd /mnt/c/ && cmd.exe /c start "rebooting WSL" cmd /c "timeout 5 && wsl -d $WSL_DISTRO_NAME" && wsl.exe --terminate $WSL_DISTRO_NAME'
听起来您正在寻找
$WSL\u发行版名称
?有关在wsl会话中使用wsl.exe
的示例,请参见。你的“异步重启”逻辑对我来说似乎是正确的。挑战在于启动一个在WSL实例终止后仍然存在的流程。它可能是基于PowerShell的,但它甚至可能需要是Windows计划的任务才能生存-不确定。我认为这可以完成任务。在WSL中,运行cmd.exe/c“WSL.exe--terminate$WSL\u DISTRO\u NAME”
来终止当前的WSL发行版。很好,谢谢@notdrc01ds,我不知道这个变量。非常好地处理了关机过程。@Umair,您对cmd.exe/c
部分的回答不正确。试试看。WSL允许从Windows运行命令,而不必使用cmd.exe
部分。实际上,您可以直接运行Windows路径上的任何Windows二进制文件。如果执行echo$PATH
,则当WSL会话启动时,您将看到所有的Windows路径都被导入其中。@YorSubs感谢您对cmd.exe/c
部分的更正。这真是太好了。我对它进行了一些调整,使窗口的标题被重命名以表示发行版cd/mnt/c/&&cmd.exe/c启动“重新启动WSL”cmd/c“超时5&&title“$WSL_发行版名称”&&WSL-d$WSL_发行版名称”&&WSL.exe——终止$WSL_发行版名称
alias shutdown='wsl.exe --terminate $WSL_DISTRO_NAME'
alias reboot='cd /mnt/c/ && cmd.exe /c start "rebooting WSL" cmd /c "timeout 5 && wsl -d $WSL_DISTRO_NAME" && wsl.exe --terminate $WSL_DISTRO_NAME'