在没有打开终端的情况下在 Windows 10 上运行 bash 后台进程

Ash*_*Ash 14 bash windows-10 windows-subsystem-for-linux

当我在 Windows 10 上编程时,我通常使用 linux 子系统,所以我所有的路径都相对于~. 我有一个 python 脚本,它在后台永远运行,直到我终止进程。如果没有打开的终端,我将如何在 Windows 10 bash 上做到这一点?

我尝试过的事情:

  • bash -c "python3 script.py 从运行。
  • nohup python3 -u script.py 然后关闭终端。
  • setsid python3 script.py 然后关闭终端。

这些都没有奏效。有没有办法做到这一点?或者,如果我从 W10 和 bash 运行脚本而不必每次都切换它们,是否有办法更改路径以便它们工作?

CBH*_*ing 15

更新

微软已经解决了这个问题。即使在bash.exe(或其他 WSL 启动程序进程)关闭后,现在也允许后台/守护进程继续运行。需要最新版本的 Win10(2018 年春季公开发布,版本 17046 或更高版本)。

以下为后人保留。


可悲/荒谬的是,没有办法做到这一点。Microsoft 以其无穷的智慧决定 WSL(Linux 的 Windows 子系统)仅在bash.exe进程打开时运行。关闭最后一个(或者甚至可能关闭最后一个窗口;我不确定它是否可以容忍无头运行),WSL 将关闭,杀死所有进程。

这样做的理由是“节约资源”,这在几个不同的层面上都是荒谬的,但最值得注意的是,该死的,我的电脑有这些资源,可以使用它们!如果我想要一个进程运行,它应该运行;如果我不想让它运行,我可以杀死它。对于明确打算用作开发人员工具的东西,有时感觉 WSL 只能用作玩物,并且不能信任其用户知道他们在做什么。

无论如何,如果您想要修复此问题,在 UserVoice 页面上投票支持考虑启用 cron 作业、守护程序和后台任务。它目前是投票第二多的请求,并且“在积压中”。


r2e*_*ans 10

WSL 最近添加的一项允许直接从“运行”或“开始”菜单启动 wsl 命令。您可以在命令后附加一个&符号(正常的外壳行为),这会导致瞬间bash终端立即消失但命令继续。

示例,在Start » Run 中

wsl sleep 20 &
wsl python -c 'import time; time.sleep(20);' &
Run Code Online (Sandbox Code Playgroud)

如果你进入 Windows 的任务管理器,它会显示一个SleepPython2命令运行 20 秒,然后自动清除。

我发现的一件事是环境变量不可用。例如,DISPLAY如果在 windows normal 方法中设置,则不会传递给 WSL。为此,需要有一种方法来传递这些变量。即使该命令不支持通过命令行参数设置所需的变量,也可以使用bash它自己来完成:

# direct, command-dependent
wsl emacs --display=:0 &

# indirect, more flexible
wsl bash -c "DISPLAY=:0 emacs" &
Run Code Online (Sandbox Code Playgroud)

注意:我目前运行的是 win10_64,版本 1709(操作系统内部版本 16299.64)。