如何从终端分离以便 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()
(你所做的)它将成为一个完全独立于你即将死掉的进程的进程。
请注意,如果保持原样,之后尝试输出任何内容将是未定义的行为。
如果你想在那个过程中继续只使用 cout
或 cerr
,我建议你使用 rdbuf
重定向它,就像你在分叉后的那个时候一样,重定向stdout 和 stderr 到 /dev/null
如果您想使用 printf
或其家族中的任何一个,那么您必须将标准输出文件描述符重新绑定到某个东西。
我正在为我的部署存储库创建一个 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()
(你所做的)它将成为一个完全独立于你即将死掉的进程的进程。
请注意,如果保持原样,之后尝试输出任何内容将是未定义的行为。
如果你想在那个过程中继续只使用 cout
或 cerr
,我建议你使用 rdbuf
重定向它,就像你在分叉后的那个时候一样,重定向stdout 和 stderr 到 /dev/null
如果您想使用 printf
或其家族中的任何一个,那么您必须将标准输出文件描述符重新绑定到某个东西。