总结

总结

我想从终端(主要是 Python 服务器)运行命令并实质上守护它们。我正在运行 Windows 安装程序附带的 MinGW 终端“Git Bash”。

尝试过的事情不是工作:

  • nohup -> 未找到命令
  • setsid -> 命令未找到
  • $ script.py &-> 表现不符合预期
  • $ script.py & disown-> 表现不符合预期

我会使用bg,但我的最终目标是在我的服务器全部运行后关闭终端,然后不是终止进程。

答案1

这是我在所以

如果您的应用程序记录到 stdout/stderr,请使用:

cmd //c start cmd //k  "path\\to\\script-dir\\script.py"

如果它通过套接字等记录到文件并且您不需要 stdout/stderr,请使用:

cmd //c start //D "path\\to\\script-dir" script.py

在这两种情况下,您都会得到一个类似守护进程的进程,当您关闭 bash 时,该进程仍会继续存在。在第一种情况下,您的脚本托管在可见cmd.exe窗口中。

多得多这里

答案2

只需在命令前加上 即可start

例如

start TortoiseGitProc /command:showcompare /revision1:master /revision2:HEAD

生成的进程继承当前工作目录。

答案3

cmd和的混合物start 有效,尽管 @antonio 的两个解决方案对我来说都是“可见的”。我试图找到另一种方法,与 MinGW 更一致。

总结

mintty bash -mc "commands &>/dev/null < /dev/null &"似乎总是有效


我不确定自这篇原始文章以来发生了什么变化,但现在使用 2.31.1,并bash以几种不同的方式在 Windows 上运行 git。

我尝试过的部分内容

这是我的结果

  1. mintty(“正常”方式)

    • mintty 上的 Stdin 是一个管道而不是 tty,需要winpty才能获得 tty(不知道这是否重要)

    我将执行这些命令,然后关闭 mintty

    命令 作品?
    git gui 不,命令git在这里被调用,并且被挂接,因此关闭 shell 会终止 git 命令
    git-gui 有效,尽管这不再是调用 CLI git,而是直接调用 Windows GUI 可执行文件git-gui。这不是一个通用的解决方案
    sleep 60 没有
    sleep 60& 仅当您按 Ctrl+D 关闭,而不是单击 X 或按 Alt+F4
    bash -c "sleep 60&" 是的(关闭 mintty 时仍会收到警告,但不会终止sleep
    mintty bash -c "sleep 60&" 没有
    mintty bash -mc "sleep 60&" 是的,完全分离
    ./foo.bat& 不可以,foo.bat使用 stdout,需要重定向
    ./foo.bat < /dev/null& 仅当您按 Ctrl+D 关闭,而不是单击 X 或按 Alt+F4
    mintty bash -mc "./foo.bat < /dev/null&" 是的,完全分离
    winpty bash -mc "./foo.bat&" 不,当 stdin 关闭时,pty 就会死掉
    winpty bash -c "./foo.bat&" < /dev/null 第一次不起作用,在后续通话中起作用
    winpty bash -mc "./foo.bat&" < /dev/null 只有一半的时间有效,随机
    winpty bash -c "./foo.bat" < /dev/null & 只有一半的时间有效,随机
    /c/Python39/python foo.py sleep与/结果相同foo.bat
  2. 在 PowerShell 中

    • 在 powershell 中运行确实会给 stdin 一个 tty

    仅显示不同的结果

    命令 作品?
    sleep 60& 没有
    bash -c "sleep 60&" 没有
    ./foo.bat < /dev/null& 没有
    mintty bash -mc "./foo.bat < /dev/null&" 没有
    mintty bash -mc "./foo.bat &> /dev/null < /dev/null&" 是的
    winpty bash -c "./foo.bat&" < /dev/null 没有
    winpty bash -c "./foo.bat&" &> /dev/null < /dev/null 第一次使用时,一半时间都有效
    winpty bash -mc "./foo.bat&" < /dev/null 没有
    winpty bash -mc "./foo.bat&" &> /dev/null < /dev/null 一半时间有效
    winpty bash -mc "./foo.bat" &> /dev/null < /dev/null & 一半时间有效

主要区别:前三行不起作用,stdout/stderr 必须重定向。这在mintty生成新代码的情况下很有趣。

  1. 在命令提示符(cmd)中

    • 在 cmd 中运行确实会给 stdin 一个 tty
    • 结果与 PowerShell 相同
  2. 在 Windows 终端中

    • 在 W 终端中运行确实会给 stdin 一个 tty
    • 结果与 PowerShell 相同

这里发生了什么

  • 我试图分离 stdin/stdout/stderr/和 tty

  • 我之前的一些测试已经TTY?ps,但这没有帮助

  • 根据对start/ 的观察cmd,我能够得到一个使用 的组合mintty。我认为这将处理嵌套引号的更多情况,因为如果需要,这会将调用保持在 GNU 参数范围内。

  • 我花了一段时间才找到winpty有效的 /redirect/bg 组合,然后我发现,如果我连续尝试 10 次,它可能会起作用 3 次,可能会起作用 8 次,但通常不会起作用 10 次。它完全不稳定

    • 现在我甚至可以使用以下方法找出原因:

      对于 s 在seq 10;执行 winpty bash -c'./foo.bat &> foo.$$'</dev/null; 完成

    • 并非所有 10 个 foo.# 文件都存在,这告诉我 bash 命令甚至还没有开始执行。

    • winpty对与 MinGW 路径转换规则不一致的参数执行额外的路径转换,因此使用winpty通常会带来麻烦

  • disownMinGW 上的 bash 似乎没有采取任何行动来支持或反对这一努力。

答案4

问题出在 mintty 上。使用“exit”关闭 bash,而不是点击 [x] 按钮。

在脚本中您可以使用“exit”作为最后一个命令。

相关内容