为了让运行 Windows 10 的客户也能享受到 Linux 的一些优势,我开发了一些 bash 脚本来自动执行他们的一些日常任务。
我让他们通过 Windows 批处理运行以下内容的脚本:
Ubuntu1804 run /usr/local/bin/script.sh
不幸的是,一些脚本花费的时间很长,要么是大量的 SQL 查询,要么是缓慢的网络和 I/O 操作,在等待期间,一些用户无法控制自己关闭“奇怪的黑色窗口”,从而终止了该进程。
即使在末尾加上 & 引号,上述命令也会被终止。
我尝试了以下操作,但没有进入testOK
我的桌面。
Ubuntu1804 run "sleep 10 && touch /mnt/c/Users/myuser/Desktop/testOK &"
但这会使窗口保持打开状态并创建文件testOK
。
Ubuntu1804 run "sleep 10 && touch /mnt/c/Users/myuser/Desktop/testOK"
我想知道是否有办法避免 Ubuntu WSL 中的进程在窗口关闭时被终止。
完全防止窗口出现就更好了。
阻止用户与其交互是一种可接受的解决方法。
客户端是具有最新安全和质量汇总的 Windows 10 专业版,我没有提供站点详细信息,因为这发生在多个客户身上,其中一些是大型 MS AD 域,另一些是仅有工作组的小型办公室。
答案1
当终端窗口关闭时,Linux X11 会向正在运行且在终端窗口打开了文件句柄的进程发送 SIGHUP。默认情况下,所有程序都会在生成该程序的终端窗口打开 stdin、stdout 和 stderr 文件句柄。WSL 会模拟该行为。
一个解决方案是使用“nohup”。如果 test.sh 是:
#!/bin/sh
sleep 10
touch ~/testOK
然后你可以像这样运行它:
D:> ubuntu run nohup sh -x ~/test.sh &
如果我输入该行后立即关闭 cmd 窗口,我会在 D:(我当前的工作目录)中得到一个文件“nohup.out”,其中包含由 test.sh 生成的文本,几秒钟后,我的 Ubuntu 主目录中就会出现 testOK。不过,您可以在 .bat 脚本中更改内容,将 nohup.out 放在其他地方。
答案2
您可以像这样创建一个 .vbs 文件:
set shell = CreateObject("WScript.Shell")
command = "bash -c 'touch /mnt/c/Users/Yourdesktop/Desktop/testOK2'"
shell.Run command,0
最后一行,“0”表示不显示窗口,“1”表示显示窗口。
我认为这应该可以完成你想要做的事情。