【问题标题】:Git post-commit hook as a background taskGit 提交后挂钩作为后台任务
【发布时间】:2011-12-16 13:39:20
【问题描述】:

我有一个脚本,我需要在提交到 git 版本控制下的项目后运行该脚本。因此,我在我的项目 .git 目录中的子目录 /hooks 中创建了一个 post-commit 挂钩,将其命名为“post-commit”并为其提供以下内容:

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

my_script 是可执行的,并且在 /bin/sh 中运行良好。事实上,它的运行时间只有几秒钟,所以我希望它能够在后台运行并与当前 shell 分离。这就是为什么我把尾随的“&”放在我的钩子上。

现在的问题是,'&' 似乎被忽略了。当我在 OSX Lion 下使用 gitx 0.7.1 提交时,gitx 挂起的时间正是 my_script 需要运行的时间。

我尝试了很多,但没有让进程本身进入后台。

这里有什么问题?

【问题讨论】:

    标签: git shell sh post-commit gitx


    【解决方案1】:

    这对我来说是这样的:

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

    【讨论】:

    • 大卫,同时我发现了一个类似的方法:nohup /usr/local/bin/my_script 2>&1 > /dev/null &
    • 不完全是正确的答案,但会指导一些人:考虑实现一个真正的守护进程。如果在 ruby​​ 中,您可以使用守护程序或阅读有关守护程序如何在 unix 中工作的说明中的基本操作:daemons.rubyforge.org/Daemons.html
    【解决方案2】:

    您也可以使用at 命令。您可能需要先安装它

    echo /path/to/your/executable | at now
    

    或:

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

    有关 at(man atthe online version)的更多信息,请参阅 at(1) 手册页

    【讨论】:

      【解决方案3】:

      尝试使用nohup

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

      【讨论】:

      • 嘿 WagnerVaz,试过了,但不幸的是它不起作用。该脚本似乎没有与当前进程分离,只要脚本运行,gitx 就会过时。
      【解决方案4】:

      如果您将 #!/bin/sh 更改为 #!/bin/bash(假设您可以使用 bash)并使用 nohup,您的示例应该可以工作。

      【讨论】:

        猜你喜欢
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 2018-09-29
        • 1970-01-01
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多