如何从终端分离以便 post-receive 挂钩在 git 完成

How to detach from terminal so that post-receive hook in git finalizes

我正在为我的部署存储库创建一个 post-接收挂钩。 钩子编译并执行我的程序。该程序输出几行我想看到的,分叉并仅在分叉过程中继续。 当我用 2>&1 1>/dev/null & 启动程序时它工作正常,尽管我没有看到任何输出。我尝试在 fork 之后调用 setsid(),但是 git 提交并没有停止,它继续输出程序输出。

有什么解决方案吗?

当你 fork 你的程序时;他们都可以访问 stdout/err 流; git 挂钩很可能正在等待关闭。

解决您的问题;如果您的分叉进程继续,关闭其对 stdout、stderr 和 stdin 的句柄;

close(fileno(stdin));
close(fileno(stdout));
close(fileno(stderr));

以及开始新会话 setsid()(你所做的)它将成为一个完全独立于你即将死掉的进程的进程。

请注意,如果保持原样,之后尝试输出任何内容将是未定义的行为。

如果你想在那个过程中继续只使用 coutcerr,我建议你使用 rdbuf 重定向它,就像你在分叉后的那个时候一样,重定向stdout 和 stderr 到 /dev/null

如果您想使用 printf 或其家族中的任何一个,那么您必须将标准输出文件描述符重新绑定到某个东西。