Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从WSL会话内部关闭或重新启动WSL会话_Bash_Powershell_Windows Subsystem For Linux - Fatal编程技术网

Bash 从WSL会话内部关闭或重新启动WSL会话

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会话。这样做有点尴尬,因为WSL不使用systemd,所以我们不能使用
重新启动
。在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
    终止当前正在运行的会话
  • 几秒钟后,新会话将启动
以上评论的功劳

要从WSL来宾中关闭会话,可以运行: 也可以重新启动,但到目前为止,我不知道如何在同一控制台窗口内获得新的终端。以下操作将重新启动WSL guest,并在完成后打开它的新控制台窗口:

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系统是作为网络资源装载的
    cmd
    不支持生成的UNC路径格式,如
    \\wsl$\Debian\
    。因此,在执行之前,最好将
    cd
    保存到它可以解析为Windows路径的目录中,例如
    C:\
    。如果ommited,cmd将投诉并将其目录更改为
    cmd
    %windir%
  • &&
    在linux和windows中完成前一个命令后运行另一个命令
    cmd
  • cmd.exe/c
    启动一个
    cmd
    实例,并告诉它执行下面的命令
  • start”“…
    是一个
    cmd
    -内部命令,用于在自己的窗口内运行另一个程序,与
    cmd
    实例无关。在这种情况下,程序是另一个
    cmd
    窗口WSL关闭时不会受到影响。
  • 在原来的Linux终端中,第一个
    cmd/c
    命令已经完成,
    &&
    之后的第三个命令关闭客户机,如上所述
  • 第二个
    cmd
    窗口等待几秒钟,然后启动同一台WSL机器的新WSL会话
创建别名 您可以通过创建别名使其更易于使用。对于
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'