运行Subversion post-commit hook作为后台进程

因为目前我们的Subversion post-commit挂钩花了太长时间来执行,所以我一直试图加快速度。

我一直在考虑执行实际的钩子作为后台进程,以便在实际的钩子完成运行之前完成svn commit

所以我创build了两个文件。

post-commit.bg做了一些耗时的工作:

 sleep 10 

而在后台执行前者的实际post-commit本身:

 bash post-commit.bg & 

当我从命令行运行post-commit ,它会很快结束,留下post-commit.bg仍在运行。 但是当我做svn commit它仍然需要10秒钟!

SVN不允许后台进程,或者我在这里做错了什么?

    我刚刚在当地证实 这似乎是由devise:

    当运行钩子时 ,svn 调用apr_proc_wait

    apr_proc_wait被devise为在返回之前等待所有subprocess退出。 这是为了避免僵尸(无主)进程超出系统。

    如果你find一个分离进程的方法(例如守护进程模式),你可能会获得一些成功,但是我不确定。

    你可能会发现在某个地方运行另一个进程会更好,这个进程会响应来自svn的一个ping – Hudson是我select的这种东西 – 作业可以通过提交后的wget中的wget来触发,也可以有它会根据你想要做的事情为你调查颠覆。

    您还需要redirectstderr:

    bash post-commit.bg 2>&1&

    这将从父进程分离(就颠覆而言),让客户端没有等待完成。 我有同样的问题,这是修复。

    在Linux上,只需使用nohup

     nohup sh -c 'sleep 10' & 

    对于windows用户:

    这个话题已经在这里讨论了: 在Windows bat文件中运行另一个程序,而不是创buildsubprocess

    我成功地testing了一些不会影响Subversion钩子的Python代码。 如上面Bert Huijben所指出的,你必须特别redirectstdout和stderr的输出。 看下面的代码示例。

    提交后文件:

     #!/usr/bin/env python2.7 import os, sys, subprocess def main(args): try: #Subversion hook will still wait even though you didn't redirect stdout or stderr #subprocess.Popen(['<PATH_TO_SVN>/hooks/postNotify.py', args[0], args[1]]) #This works however devNull = open(os.devnull, 'w') subprocess.Popen(['<PATH_TO_SVN>/hooks/postNotify.py', args[0], args[1]], stdout=devNull, stderr=devNull) devNull.close() except BaseException as e: sys.stderr.write('Failed to launch notify script with error {}\n'.format(str(e)) sys.exit(1) sys.exit(0) if __name__ == '__main__': main(sys.argv[1:]) 

    其中称为我命名为postNotify.py的脚本:

     #!/usr/bin/env python2.7 import os, sys, time time.sleep(15) os.stderr.write('Generic Problem\n') sys.exit(1) 

    *编辑1 – 我应该提到这是反对Subversion 1.9.3

    我认为德曼是对的。 你也可以注册post-commit.bg作为批处理过程执行 – 在linux上,使用'batch'命令(at) 但要注意潜在的洗牌