[eggjs/egg]reload worker导致的问题

2025-10-27 558 views
0
What happens?

我们都知道在开发过程中,不用重启就能运行新加的代码,这个功能就是reload worker相关的功能,这个过程中会中断已有进程的执行, 我把代码部署在容器中,也会带有这个功能,但是我不知道怎么关闭他,因为需要上传临时文件到服务器上,这会触发reload worker,有些运气不好的请求就会断掉

复现步骤,错误日志以及相关配置 相关环境信息
  • hibernate
  • Node 版本:v12.13.0
  • Egg 版本:2.15.1

回答

2

你在线上用 npm run dev 部署的?

7

用这个命令:egg-scripts start --port=7001 --title=egg-server-showcase

4

用这个命令:egg-scripts start --port=7001 --title=egg-server-showcase

是不是哪里有问题,文件的 watch hot reload 我记得只有 dev 下会有

6

用这个命令:egg-scripts start --port=7001 --title=egg-server-showcase

是不是哪里有问题,文件的 watch hot reload 我记得只有 dev 下会有

对,应该是agent:development,这个问题很奇怪,因为不使用容器,直接在服务器上部署运行,并不会这样,启动命令多一个--daemon

2

对,应该是agent:development,这个问题很奇怪,因为不使用容器,直接在服务器上部署运行,并不会这样,启动命令多一个--daemon

你的意思是正常服务器部署 egg-scripts start 不会有,容器里加了个 --daemon 就会 hot reload 了?

6

egg-development 来做开发期代码变更的重启的,它只会在 dev 下启动,你可以检查下你的 run/application_config.json 看看 config.env 是啥, plugin.development 是否存在,如果没有,那说明不是它干的,你要检查你的其他代码和配置

2

config.env 是prod, plugin.development存在,为什么会这样呢

  • 容器中的plugin.development
    "development": {
      "enable": false,
      "package": "egg-development",
      "name": "development",
      "dependencies": [
        "watcher"
      ],
      "optionalDependencies": [],
      "env": [
        "local"
      ],
      "from": "/app/node_modules/egg/config/plugin.js",
      "path": "/app/node_modules/egg-development",
      "version": "2.7.0"
    },
  • 直接部署在服务器上的plugin.development
    "development": {
      "enable": false,
      "package": "egg-development",
      "name": "development",
      "dependencies": [
        "watcher"
      ],
      "optionalDependencies": [],
      "env": [
        "local"
      ],
      "from": ".../src/node_modules/egg/config/plugin.js",
      "path": ".../src/node_modules/egg-development",
      "version": "2.7.0"
    },

    @atian25 这是两个环境下的plugin.developmentenable都是false啊

0

对,应该是agent:development,这个问题很奇怪,因为不使用容器,直接在服务器上部署运行,并不会这样,启动命令多一个--daemon

你的意思是正常服务器部署 egg-scripts start 不会有,容器里加了个 --daemon 就会 hot reload 了?

服务器部署加了--daemon,容器没有加

2

"enable": false 说明不是它干的。

把你完整的重启日志贴出来吧

2
2021-06-09 10:13:23,222 INFO 400 [-/10.0.2.26/-/22ms POST /agents/completion] The path is : /agents/completion and method is: POST
2021-06-09 10:13:23,308 INFO 400 [-/10.0.2.26/-/108ms POST /agents/completion] the file path is : 
2021-06-09 10:13:23,521 INFO 400 [-/10.0.2.26/-/321ms POST /agents/completion] the audio file is : 
2021-06-09 10:13:23,613 INFO 400 [egg-sequelize](2ms) Executed (default): SELECT 
2021-06-09 10:13:23,634 INFO 400 [egg-sequelize](6ms) Executed (default): SELECT 
2021-06-09 10:13:23,719 INFO 400 [egg-sequelize](11ms) Executed (default): INSERT INTO 
2021-06-09 10:13:36,025 INFO 444 [egg-swagger-doc] register router: get /swagger-doc
2021-06-09 10:13:36,208 INFO 444 [egg-swagger-doc] register router: get /swagger-ui.html
2021-06-09 10:13:36,211 INFO 444 job lock init
2021-06-09 10:13:36,737 INFO 444 [egg-sequelize](2ms) Executed (default): SELECT 1+1 AS result
2021-06-09 10:13:36,738 INFO 444 [egg-sequelize](2ms) Executed (default): SELECT 1+1 AS result
2021-06-09 10:13:37,241 INFO 433 [egg-sequelize](2ms) Executed (default): SELECT 
2021-06-09 10:33:37,244 INFO 312 [egg-sequelize](2ms) Executed (default): SELECT 

我去掉了sql相关的内容,其他没有改,最后两个select是job在reload后第一次执行,job lock init这句话是在app.beforeStart中打印的

2

reload 日志呢???

400 和 444 是 2 个 worker 了,检查你的代码,是不是进程挂掉重启了啥的,看 master 的日志。

不是 egg-development 做的。

4

2021-06-09 10:13:36,025 INFO 444 [egg-swagger-doc] register router: get /swagger-doc
2021-06-09 10:13:36,208 INFO 444 [egg-swagger-doc] register router: get /swagger-ui.html
2021-06-09 10:13:36,211 INFO 444 job lock init
2021-06-09 10:13:36,737 INFO 444 [egg-sequelize](2ms) Executed (default): SELECT 1+1 AS result
2021-06-09 10:13:36,738 INFO 444 [egg-sequelize](2ms) Executed (default): SELECT 1+1 AS result

这几句就是reload的证明啊,程序执行了app.beforeStart就会有这几句日志,而且每次都是在执行了文件保存打印,

7

我指的是不是 egg-development 干的,它重启不是这日志。 检查你的 master 日志和对应的代码。

2

可以看下 egg-cluster 源码

6
2021-06-09 10:13:33,828 INFO 444 [egg:logger] init all loggers with options: {"dir":"/root/logs/***","encoding":"utf8","env":"prod","level":"INFO","consoleLevel":"INFO","disableConsoleAfterReady":true,"outputJSON":false,"buffer":true,"appLo
gName":"***-web.log","coreLogName":"egg-web.log","agentLogName":"egg-agent.log","errorLogName":"common-error.log","coreLogger":{},"allowDebugAtProd":false,"type":"application"}
2021-06-09 10:13:34,027 INFO 444 [egg-multipart] file mode enable
2021-06-09 10:13:34,027 INFO 444 [egg-multipart] will save temporary files to "/tmp/egg-multipart-tmp/***, cleanup job cron: "0 30 4 * * *"
2021-06-09 10:13:35,324 INFO 444 [egg-redis] server connecting redis://:***@redis-master:6379/0
2021-06-09 10:13:35,721 INFO 444 [egg-static] starting static serve /public/ -> /app/app/public
2021-06-09 10:13:35,723 INFO 444 [egg-security] use methodnoallow middleware
2021-06-09 10:13:35,725 INFO 444 [egg-security] use noopen middleware
2021-06-09 10:13:35,725 INFO 444 [egg-security] use nosniff middleware
2021-06-09 10:13:35,726 INFO 444 [egg-security] use xssProtection middleware
2021-06-09 10:13:35,726 INFO 444 [egg-security] use xframe middleware
2021-06-09 10:13:35,726 INFO 444 [egg-security] use dta middleware
2021-06-09 10:13:35,726 INFO 444 [egg-security] compose 6 middlewares into one security middleware
2021-06-09 10:13:35,819 INFO 444 [egg:core] dump config after load, 7ms
2021-06-09 10:13:36,411 INFO 444 [egg-redis] client connect success
2021-06-09 10:13:36,609 INFO 444 [egg-redis] instance[0] status OK, client ready
2021-06-09 10:13:36,711 INFO 444 [egg-watcher:application] watcher start success
2021-06-09 10:13:36,819 INFO 444 [egg:core] dump config after ready, 10ms

coreLogName的日志吗?

9

没 daemon 时时直接打印到 stdout 的,egg-scripts start 干的。

你还是看下 egg-cluster 源码吧,看下进程退出那里的处理,然后分析下你的进程是啥状态

7

好的,谢谢