gpt4 book ai didi

python - git post-receive hook 不在后台运行

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:14 24 4
gpt4 key购买 nike

根据git documentation post-receive Hook 实质上会阻塞 repo,直到它完成:

... the client doesn’t disconnect until it has completed, so be careful if you try to do anything that may take a long time.

如果您需要钩子(Hook)来启动一个构建作业,然后在启动另一个作业(比如部署)之前轮询它是否完成,这会导致问题。例如,构建服务器无法在所述脚本运行时从存储库中获取数据。

我们还假设您完全没有能力将您的脚本放在 git 服务器上作为 shell 命令与整个 nohup/usr/bin/env python/path/to/post_receive.py 一起执行 2 >&1 >/dev/null & 类似于this question 的方法.

我们还假设您已经尝试了类似于 this 的整个双重 os.fork()'ing 守护进程和其他一些问题(下面的不工作示例代码),发现 git 在完成 Hook 之前仍然等待长时间运行的 child 完成。

pid = os.fork()
if pid == 0:
os.setsid()
pid = os.fork()
if pid == 0:
long_running_post_receive_function()
else:
os._exit(0)
else:
for fd in range(0, 3):
os.close(fd)
os._exit(0)

那么,在这些限制下,有没有人成功地使用了一个长时间运行的 python post-receive hook,它实际上在后台运行而不阻塞 repo?

编辑

工作 没有异常处理的最小结构...感谢@torek 和@jthill

pid = os.fork()
if pid == 0:
os.setsid()
pid = os.fork()
if pid == 0:
for fd in range(0, 3):
os.close(fd)
long_running_post_receive_function()
else:
os._exit(0)
else:
sys.exit()

最佳答案

您需要关闭所有描述符访问,以便 ssh 知道它永远不会再获得任何数据。换句话说,调用 os.close在描述符 0 到 2 上。实际上,您需要将它们打开,所以最好打开 os.devnullos.dup2 0、1 和 2 的结果描述符(对于真正健壮的软件,请确保 os.open 尚未返回值 0 <= fd <= 2,当然,如果返回值,那没关系,只需在 dup2-ing 时将其保留在原位其余的)。

(您仍然需要通常的双叉技巧,放弃 session ID 等可能是明智的。在一些 Unix 派生系统中,有一个名为 daemon 的库例程,它可能在 libc 或libutil,它为你做这一切。一些细节不可避免地依赖于操作系统,例如放弃控制终端的方式(如果有的话)。但是,你链接的特定于 Python 的答案中缺少的主要内容是替换 stdin/stdout/stderr 描述符。)

关于python - git post-receive hook 不在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com