agent_worker.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. 'use strict';
  2. /**
  3. * agent worker is child_process forked by master.
  4. *
  5. * agent worker only exit in two cases:
  6. * - receive signal SIGTERM, exit code 0 (exit gracefully)
  7. * - receive disconnect event, exit code 110 (maybe master exit in accident)
  8. */
  9. // $ node agent_worker.js options
  10. const options = JSON.parse(process.argv[2]);
  11. if (options.require) {
  12. // inject
  13. options.require.forEach(mod => {
  14. require(mod);
  15. });
  16. }
  17. const debug = require('debug')('egg-cluster');
  18. const gracefulExit = require('graceful-process');
  19. const ConsoleLogger = require('egg-logger').EggConsoleLogger;
  20. const consoleLogger = new ConsoleLogger({ level: process.env.EGG_AGENT_WORKER_LOGGER_LEVEL });
  21. const Agent = require(options.framework).Agent;
  22. debug('new Agent with options %j', options);
  23. let agent;
  24. try {
  25. agent = new Agent(options);
  26. } catch (err) {
  27. consoleLogger.error(err);
  28. throw err;
  29. }
  30. function startErrorHandler(err) {
  31. consoleLogger.error(err);
  32. consoleLogger.error('[agent_worker] start error, exiting with code:1');
  33. process.exitCode = 1;
  34. process.kill(process.pid);
  35. }
  36. agent.ready(err => {
  37. // don't send started message to master when start error
  38. if (err) return;
  39. agent.removeListener('error', startErrorHandler);
  40. process.send({ action: 'agent-start', to: 'master' });
  41. });
  42. // exit if agent start error
  43. agent.once('error', startErrorHandler);
  44. gracefulExit({
  45. logger: consoleLogger,
  46. label: 'agent_worker',
  47. beforeExit: () => agent.close(),
  48. });