如何在 Windows WSL(Ubuntu1804)中后台运行 Linux 命令

如何在 Windows WSL(Ubuntu1804)中后台运行 Linux 命令

为了让运行 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”表示显示窗口。

我认为这应该可以完成你想要做的事情。

相关内容