AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 65450
Accepted
Rene Saarsoo
Rene Saarsoo
Asked: 2009-09-16 00:25:51 +0800 CST2009-09-16 00:25:51 +0800 CST 2009-09-16 00:25:51 +0800 CST

将 Subversion 提交后挂钩作为后台进程运行

  • 772

因为目前我们的 Subversion 提交后挂钩执行时间太长,所以我一直在努力加快速度。

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

所以我创建了两个文件。

Apost-commit.bg做一些耗时的事情:

sleep 10

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

bash post-commit.bg &

当我从命令行运行post-commit时,它很快完成,post-commit.bg仍然在运行。但是当我这样做svn commit时,仍然需要 10 秒!

SVN是否以某种方式不允许后台进程,或者我在这里做错了什么?

svn
  • 6 6 个回答
  • 5616 Views

6 个回答

  • Voted
  1. Nathan Arthur
    2010-07-22T19:16:20+08:002010-07-22T19:16:20+08:00

    您还需要重定向 stderr :

    bash post-commit.bg 2>&1 &

    这会将进程与父进程分离(就颠覆而言)并让客户端无需等待即可完成。我遇到了同样的问题,这就是解决方法。

    • 12
  2. Best Answer
    Jim T
    2009-09-16T01:32:09+08:002009-09-16T01:32:09+08:00

    我刚刚在当地证实了这一点。它似乎是设计使然:

    运行 hooks时,svn调用 apr_proc_wait

    apr_proc_wait旨在等待所有子进程退出后再返回。这是为了避免僵尸(无主)进程超出系统。

    如果您找到一种分离进程的方法(即守护程序模式),您可能会取得一些成功,但我不确定。

    您可能会发现在某处运行另一个进程更好地响应来自 svn 的 ping - Hudson是我对这类事情的选择 - 作业可以由post-commit 钩子中的 wget触发,或者您可以有它会为您投票颠覆,这取决于您想要做什么。

    • 5
  3. user9474
    2010-02-02T21:40:54+08:002010-02-02T21:40:54+08:00

    在 Linux 上,只需使用nohup:

    nohup sh -c 'sleep 10' &
    
    • 2
  4. honzajscz
    2011-06-04T05:21:02+08:002011-06-04T05:21:02+08:00

    对于 Windows 用户:

    这个话题已经在这里讨论过:在 Windows bat 文件中运行另一个程序并且不创建子进程

    • 2
  5. Aaron
    2017-03-31T15:09:06+08:002017-03-31T15:09:06+08:00

    我成功地测试了一些不会阻止颠覆挂钩的 Python 代码。正如上面 Bert Huijben 所指出的,您必须专门重定向 stdout 和 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)
    

    *edit 1 - 我应该提到这是针对 Subversion 1.9.3

    • 1
  6. Flo
    2010-02-02T23:52:21+08:002010-02-02T23:52:21+08:00

    我认为德曼是对的。您还可以注册 post-commit.bg 以作为批处理过程执行 - 在 Linux 上,为此使用“批处理”命令 (at);但要注意潜在的改组...

    • 0

相关问题

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • 如何定期复制 SVN 存储库而不会丢失目标标签和分支?

  • 如何通过 SVN 命令行接受 SSL 证书?

  • 如何在 slicehost 上设置集市

  • 如何在 Mac OS X 中正确安装 Subversion?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve