因为目前我们的 Subversion 提交后挂钩执行时间太长,所以我一直在努力加快速度。
我一直在考虑将实际挂钩作为后台进程执行,以便svn commit
在实际挂钩完成运行之前完成。
所以我创建了两个文件。
Apost-commit.bg
做一些耗时的事情:
sleep 10
以及在后台执行前者的实际post-commit
本身:
bash post-commit.bg &
当我从命令行运行post-commit
时,它很快完成,post-commit.bg
仍然在运行。但是当我这样做svn commit
时,仍然需要 10 秒!
SVN是否以某种方式不允许后台进程,或者我在这里做错了什么?
您还需要重定向 stderr :
bash post-commit.bg 2>&1 &
这会将进程与父进程分离(就颠覆而言)并让客户端无需等待即可完成。我遇到了同样的问题,这就是解决方法。
我刚刚在当地证实了这一点。它似乎是设计使然:
运行 hooks时,svn调用 apr_proc_wait
apr_proc_wait旨在等待所有子进程退出后再返回。这是为了避免僵尸(无主)进程超出系统。
如果您找到一种分离进程的方法(即守护程序模式),您可能会取得一些成功,但我不确定。
您可能会发现在某处运行另一个进程更好地响应来自 svn 的 ping - Hudson是我对这类事情的选择 - 作业可以由post-commit 钩子中的 wget触发,或者您可以有它会为您投票颠覆,这取决于您想要做什么。
在 Linux 上,只需使用
nohup
:对于 Windows 用户:
这个话题已经在这里讨论过:在 Windows bat 文件中运行另一个程序并且不创建子进程
我成功地测试了一些不会阻止颠覆挂钩的 Python 代码。正如上面 Bert Huijben 所指出的,您必须专门重定向 stdout 和 stderr 的输出。请参阅下面的代码示例。
提交后文件:
它调用了我命名为 postNotify.py 的脚本:
*edit 1 - 我应该提到这是针对 Subversion 1.9.3
我认为德曼是对的。您还可以注册 post-commit.bg 以作为批处理过程执行 - 在 Linux 上,为此使用“批处理”命令 (at);但要注意潜在的改组...