fork节点进程如何在退出时向终端或父进程发送数据?



我正在处理一个奇怪的问题,我在网上找不到答案,也没有经过大量的试验和错误。

在多进程集群中,分叉的工作进程可以运行任意长的命令,但是父进程会监听工作进程发送的keepalive消息,并杀死卡住超过X秒的工作进程。

工作进程可以与外部世界异步通信(使用http或process. net)。发送ipc通信),但在退出时,我希望能够通信一些东西(通常是队列日志或错误细节)。

流程的大多数在线文档。on('exit', handler)表示console.log的使用,但是似乎分叉的进程不继承正常的标准输出,并且console.log不是直接的tty,它是一个流(ipc流,我猜?)。因此,进程退出处理程序不允许我使用console.log来记录额外的行(或者即使它允许,我也不确定这些行结束在哪里)

我尝试了各种分叉选项的组合(沉默/不沉默,非默认的stdio选项,如继承),使用fs。写入写入到tty或实际文件,使用process。发送,或者,但在任何情况下,我都不能让on-exit处理程序记录任何可见的地方。

如何让分叉的进程成功登录退出?

小附加点-所有这些测试都是在类unix系统(macos, amazon linux…)上进行的,并且父进程和子进程都使用——sign -trace触发,以便我们可以在退出时获得被中断进程的至少前10个堆栈帧。这些帧成功到达终端

这是关于SIGINT如何处理的一点误解,我相信这是不可能实现我想要的,但我很想听到是否有人找到了解决方案。

  • Node有自己的SIGINT处理程序,它"更强大";通常它会中断无限循环,这在代码被长时间运行的操作阻塞的情况下非常有用。
  • 节点允许通过附加--trace-sigint标志来捕获执行的最后帧,从而提高自己的SIGINT调试能力。

如果我理解正确的话,有4种不同的行为

  • 没有自定义处理程序,事件循环阻塞
    • 进程终止,不再执行任何代码。(--trace-sigint可以给出一些堆栈跟踪)
  • 没有自定义处理程序,事件循环没有阻塞
    • 正常退出流程,process.on('exit')事件触发。
  • 自定义处理程序,事件循环阻塞
    • 在事件循环解除阻塞(如果发生)之前什么都不发生,然后正常退出流
  • 自定义处理程序,事件循环未阻塞
    • 正常退出流程。

无论进程以何种方式启动,都会发生这种情况,并且这不是管道或退出事件的问题-在事件循环被阻塞并且本机信号处理程序就绪的情况下,进程终止而不进行任何进一步执行。

似乎没有办法在阻塞事件循环期间强制进程退出,并且在本机中断后仍然在同一进程上运行节点代码以恢复更多信息。

考虑到这一点,我认为从卡住的进程中恢复信息的最好方法是在它冻结之前将数据从它流出来(听起来很明显,但在生产环境中会带来很多额外的考虑)。

最新更新