如何在WSL2中启动Windows应用并通过终端Ctrl-C控制前台进程?
如何在WSL2中启动Windows应用并通过终端Ctrl-C控制前台进程?
我之前也碰到过一模一样的需求——在WSL2里启动Windows程序,还想让终端保持前台控制,按Ctrl-C就能直接关掉它。试了几种方法,这里分享两个最实用的:
方法一:用PowerShell的等待启动命令
这是最简单的方式,直接借助PowerShell的Start-Process命令让WSL终端等待Windows进程结束,同时Ctrl-C能传递中断信号:
powershell.exe -Command "Start-Process -FilePath 'mpv.exe' -Wait"
如果你的程序是GUI应用(比如mpv),其实不用加-NoNewWindow,因为GUI程序本身不会占用终端窗口,但-Wait会让PowerShell一直等待程序关闭,WSL的bash也会跟着等待。此时按下Ctrl-C,PowerShell会收到中断信号,进而终止它启动的mpv进程,完美符合你的需求。
方法二:自定义脚本跟踪进程(更灵活)
如果需要更灵活的控制,比如批量处理或者自定义中断逻辑,可以写一个简单的bash脚本,自动跟踪Windows进程并在Ctrl-C时杀死它:
- 新建一个脚本文件,比如
win-run.sh,内容如下:
#!/bin/bash # 启动Windows程序并后台运行 "$@" & WSL_PID=$! # 通过PowerShell获取对应的Windows进程PID WIN_PID=$(wsl.exe -e powershell.exe -Command " \$wslProcess = Get-WmiObject Win32_Process | Where-Object { \$_.ProcessId -eq $WSL_PID } Get-WmiObject Win32_Process | Where-Object { \$_.ParentProcessId -eq \$wslProcess.ParentProcessId } | Select-Object -ExpandProperty ProcessId ") # 设置陷阱:收到Ctrl-C时杀死Windows进程 trap "wsl.exe -e taskkill /PID $WIN_PID /F" INT # 等待WSL侧的进程结束 wait $WSL_PID
- 给脚本加执行权限:
chmod +x win-run.sh
- 用它启动你的程序:
./win-run.sh mpv.exe
这个脚本会自动关联WSL进程对应的Windows PID,当你按下Ctrl-C时,会调用taskkill强制终止Windows程序,全程在终端里就能控制。
额外小技巧
如果是控制台类的Windows程序(比如cmd.exe、python.exe),可以直接用winpty来启动,它会把Windows程序和WSL终端绑定,Ctrl-C直接就能终止:
winpty cmd.exe
不过GUI程序用前面两种方法就足够啦。
备注:内容来源于stack exchange,提问作者dewijones92
相关产品推荐
相关产品推荐

