我希望能够重新启动WSL会话。这样做有点尴尬,因为WSL不使用systemd,所以我们不能使用reboot。在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 (您必须确保在调用.exe命令时总是添加.exe,否则它们不能工作)来关闭当前运行的WSL会话wsl.exe -t Ubuntu-20.03,但问题是我不知道会话名。
当我们在WSL会话中时,hostname是不同的,因此我不知道如何找到我所在的当前正在运行的会话的名称(可能是一个Windows命令,它告诉我从哪个进程运行??)。
理想情况下,我希望命令等同于重新启动。我想这看起来应该是:
运行一个异步命令,该命令将在将来启动一个新会话5-10秒,以允许上一次会话完全关闭(并且在此会话为terminated).
。
发布于 2021-04-14 10:40:40
给上面的评论者的学分。
若要从WSL来宾中关闭会话,可以运行:
wsl.exe --terminate $WSL_DISTRO_NAME重新启动也是可能的,但是到目前为止,我还不知道如何在同一个控制台窗口中获得一个新的终端。以下内容将重新启动WSL来宾,并在它完成后打开其新的控制台窗口:
cd /mnt/c/ && cmd.exe /c start "rebooting WSL" cmd /c "timeout 5 && wsl -d $WSL_DISTRO_NAME" && wsl.exe --terminate $WSL_DISTRO_NAME解释
从
cmd不支持生成的UNC路径格式,例如\\wsl$\Debian\<...>。因此,最好在执行cd之前将其解析为Windows (如C:\ )的目录。如果省略,cmd将在上一条命令在linux中完成后,将其目录更改为%windir%.&&,然后windows cmd.cmd.exe /c启动一个cmd实例,并告诉它执行一条命令,即follows.start "<WindowTitle>" ...是一个cmd-internal命令,以便独立于cmd实例在自己的窗口中运行另一个程序。在这种情况下,程序是另一个cmd窗口。当WSL关闭原来的Linux终端down.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'发布于 2022-09-01 09:25:53
扩展@BasementScience的转换
为了管理远程WSL,我设置了一个Windows作业,它使用一个TaskScheduler启动wsl,然后启动cron、ssh、rsyslog和autossh (这样我就可以连接回WSL)。
因此,我很自然地希望在远程WSL重新启动时也能启动这些进程,这样之后我就可以再次登录了。
# Added to $HOME/.bashrc - Renamed aliases to separate from OS commands
alias wslshutdown='wsl.exe --terminate $WSL_DISTRO_NAME'
alias wslreboot='cd /mnt/c/ && cmd.exe /c start "Rebooting WSL" cmd /c "timeout 5 && wsl -d $WSL_DISTRO_NAME" -- sudo /etc/init-wsl && wsl.exe --terminate $WSL_DISTRO_NAME'细节在这里,... & wsl -d $WSL_DISTRO_NAME" -- sudo /etc/init-wsl & ...
这将不会启动一个新的shell,但将启动我的进程,以便我可以再次登录。
必须创建/etc/init-wsl脚本:
sudo touch /etc/init-wsl && sudo chmod 755 /etc/init-wsl
# Add services as needed
sudo bash -c 'cat << EOF > /etc/init-wsl
service ssh start
service cron start
EOF'# Ensure your user (the %sudo group) can sudo the init script without password
sudo bash -c 'cat << EOF > /etc/sudoers.d/user-service
%sudo ALL=NOPASSWD: /usr/sbin/service *
%sudo ALL=NOPASSWD: /etc/init-wsl
EOF'https://stackoverflow.com/questions/66375364
复制相似问题