2013-07-18 129 views
10

我对post-receive执行单元测试,但不希望用户等待它。异步git钩子?

我试图从混帐用户邮件列表(“只是&它”)的建议,但是这是行不通的:https://groups.google.com/forum/#!topic/git-users/CFshrDgYYzE

混帐似乎等待bash脚本退出,即使我只是把这个在挂钩/收到后:

exec-unit-tests.sh & 
+0

您是否尝试了该帖子中建议的其他方式使用cron安排异步作业?像'at'来按需安排工作(并且在将来不远)可能也值得研究 –

+0

这也可能工作,但我没有尝试它。 – oberhamsi

回答

17

这对我有效。 &和标准输出& stderr管道必须关闭:

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

为了把命令的背景下,这两个stdoutstderr必须关闭。如果其中任何一个保持打开状态,则进程将不在后台,并且在完成钩子脚本之前提交操作才会完成。

懒惰的另一种方法是简单地重定向stdoutstderr/dev/null

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

这是一个有点不太干净,但也许更容易理解和记忆,并且具有相同的效果。

+0

found here:http://git.661346.n2.nabble.com/Background-processes-in-post-receive-hook-td6235357.html – oberhamsi

+0

其实'stdout'和'stderr'都必须关闭(就像你的答案一样已经做到了)。如果其中任何一个保持打开,则该过程将不在后台。我个人使用'>/dev/null 2>/dev/null&'来获得相同的效果,因为它更容易知道没有在man bash中查找的内容。 – janos

+1

我更喜欢你的/ dev/null解决方案!请让它成为答案 – oberhamsi