我想从终端(主要是 Python 服务器)运行命令并实质上守护它们。我正在运行 Windows 安装程序附带的 MinGW 终端“Git Bash”。
尝试过的事情不是工作:
- nohup -> 未找到命令
- setsid -> 命令未找到
$ script.py &
-> 表现不符合预期$ script.py & disown
-> 表现不符合预期
我会使用bg
,但我的最终目标是在我的服务器全部运行后关闭终端,然后不是终止进程。
答案1
答案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。
我尝试过的部分内容
这是我的结果
以
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
- mintty 上的 Stdin 是一个管道而不是 tty,需要
在 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
生成新代码的情况下很有趣。
在命令提示符(cmd)中
- 在 cmd 中运行确实会给 stdin 一个 tty
- 结果与 PowerShell 相同
在 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
通常会带来麻烦
disown
MinGW 上的 bash 似乎没有采取任何行动来支持或反对这一努力。
答案4
问题出在 mintty 上。使用“exit”关闭 bash,而不是点击 [x] 按钮。
在脚本中您可以使用“exit”作为最后一个命令。