异步 Git 钩子?

15

我在 post-receive 上执行单元测试,但不希望用户等待。

我尝试了来自 git-user 邮件列表的建议("just & it"),但这不起作用:https://groups.google.com/forum/#!topic/git-users/CFshrDgYYzE

即使我只是把这个放在 hooks / post-receive 中,git 似乎也会等待 bash 脚本退出:

exec-unit-tests.sh &

你尝试过那篇帖子中提到的其他方法吗?例如使用cron调度异步作业?类似于“at”来按需调度作业(而不是在将来很远的时间)也值得研究。 - Nevik Rehnel
可能也可以,我没有尝试过。 - oberhamsi
1个回答

26

这对我有用。必须关闭&和stdout& stderr管道:

long-running-command >&- 2>&- & 

为了把命令放到后台,必须同时关闭 stdoutstderr。如果它们中的任何一个保持打开状态,则进程不会在后台运行,提交操作将等到钩子脚本完成后才完成。

一种懒惰的替代方法是将 stdoutstderr 简单地重定向到 /dev/null

long-running-command >/dev/null 2>&1 & 

这种方法不太干净,但或许更容易理解和记忆,并且具有相同的效果。


在此处找到:http://git.661346.n2.nabble.com/Background-processes-in-post-receive-hook-td6235357.html - oberhamsi
实际上,必须关闭stdoutstderr(就像您的答案已经做到了)。如果它们中的任何一个保持打开状态,则进程将无法在后台运行。个人而言,我使用>/dev/null 2>/dev/null &来获得相同的效果,因为这样更容易知道它的作用,而不必查阅man bash - janos
1
我更喜欢你的/dev/null解决方案!请将其作为答案。 - oberhamsi
1
谢谢,我很欣赏你的体育精神 :) 但是你回答得更快,你应该得到荣耀 ;-) 我把我的版本附加在你的上面,如果你想要进一步修改,请随意。稍后我会删除这个和之前的评论以清理一下。 - janos
对我来说,使用 long-running-command >&- 2>&- & 确实防止了 Git 等待脚本(耶!),但它也阻止了脚本创建预期的输出。也许是因为在脚本中调用的程序正在使用 stdout 进行输出?"post-commit" 内容(在 Win10 上): #!/bin/sh path\myScript.bat >&- 2>&- &"myScript.bat" 内容: title Run other app automatically start path\someoneElsesApp.exe -arg1 -arg2 "inputFile1.xml" "inputFile2.xml" "outputFile.txt" - Elias Mossholm
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接