作为后台任务的Git提交后钩子

24

我有一个脚本,需要在提交到受git版本控制的项目后运行。因此我在项目的.git目录下创建了一个post-commit hook,在子目录/hooks中命名为'post-commit',并给它添加了以下内容:

#!/bin/sh
# I am a post-commit hook
/usr/local/bin/my_script &

我的脚本是可执行的,在/bin/sh下运行良好。实际上,它需要运行几秒钟,所以我希望将其后台化并与当前Shell分离。这就是为什么我在钩子中加上了"&"的原因。

现在的问题是,"&"似乎被忽略了。当我在OSX Lion下使用gitx 0.7.1提交时,gitx会挂起,正好等待我的脚本运行完毕。

我尝试了很多次,但无法将进程放到后台运行。

这里出了什么问题?

4个回答

17

这是我的操作步骤:

#!/bin/sh
# I am a post-commit hook
nohup /usr/local/bin/my_script &>/dev/null &

David,与此同时我发现了一种类似的方法:nohup /usr/local/bin/my_script 2>&1 > /dev/null & - GeorgieF
不完全是正确的答案,但可以指导一些人:考虑实现一个真正的守护进程。如果你使用Ruby,可以使用Daemons或阅读Unix中守护进程工作原理的基础知识:http://daemons.rubyforge.org/Daemons.html - David Pelaez

4
您还可以使用at命令。您可能需要先安装它。
echo /path/to/your/executable | at now

或者:

echo bash /path/to/your/script | at now

请参阅at(1)手册页面,了解有关at的更多信息(man at在线版本)。


2
尝试使用 nohup
#!/bin/sh
# I am a post-commit hook
nohup /usr/local/bin/my_script &

嘿WagnerVaz,我试了一下但不幸的是它没有生效。脚本似乎无法从当前进程中分离出来,只要脚本在运行,gitx就会失效。 - GeorgieF

1
如果你将#!/bin/sh更改为#!/bin/bash(假定您使用bash没有问题),并使用nohup,那么你的示例应该可以运行。

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