子进程的优雅退出

案例描述

在做 egg-cluster 的时候,app worker 是由 cluster fork 出来的,然而 agent worker 是 master 通过 child_process.fork 出来的。 他们两者之间在 master 正常退出的情况下,没太大区别。

但是在 master 意外被强杀,如 kill -9 杀掉,那么 app worker 还是会优雅退出, 但是 agent worker 缺变成了孤儿进程,通过 https://github.com/eggjs/egg-cluster/pull/27 可以看到最终的效果。

这个 fix 也证明,通过 child_process fork 出来的子进程, 如果需要实现父进程挂了子进程也跟着挂,必须在子进程里面也加上相应的处理,才能实现,没办法只通过父进程来实现。

于是我们将这里子进程优雅退出的解决方案封装到一个 graceful-process 模块统一解决,只需要在子进程代码里面执行一下优雅退出逻辑即可。

const gracefulExit = require('graceful-process');

gracefulExit({
  logger: yourlogger,
  label: 'my_worker',
});

使用案例

Comments

Fork me on GitHub