React项目在Windows Server上偶发kill ENOSYS崩溃问题排查求助
问题排查:React项目在Windows Server 2019上启动崩溃(Error: kill ENOSYS)
环境与问题现象
- 运行环境:Windows Server 2019(IIS 10),Node v14.21.3,Yarn 1.22.19
- 崩溃现象:执行
npm start启动项目时偶尔触发崩溃,抛出以下错误:
internal/child_process.js:497 throw errnoException(err, 'kill'); ^ Error: kill ENOSYS at ChildProcess.kill (internal/child_process.js:497:13) at process.<anonymous> (C:\app\insurance_site\node_modules\cross-env\dist\index.js:53:19) at process.emit (events.js:400:28) { errno: -4054, code: 'ENOSYS', syscall: 'kill' } internal/process/per_thread.js:210 throw errnoException(err, 'kill'); ^ Error: kill ENOSYS at process.kill (internal/process/per_thread.js:210:13) at process.listener (C:\Program Files (x86)\Yarn\lib\cli.js:76410:15) at process.emit (events.js:400:28) { errno: -4054, code: 'ENOSYS', syscall: 'kill' }
项目依赖信息
package.json:
{ "name": "web-site", "version": "0.1.0", "private": true, "dependencies": { "@kunukn/react-collapse": "^2.2.7", "@rehooks/window-scroll-position": "^1.0.1", "@types/dotenv": "=6.1.1", "@types/express": "=4.17.1", "@types/js-base64": "=2.3.1", "@types/lodash": "=4.14.149", "@types/morgan": "=1.7.37", "@types/node": "10.17.17", "@types/node-fetch": "=2.5.0", "@types/node-sass": "=4.11.0", "@types/react": "^16.9.16", "@types/react-autosuggest": "^9.3.13", "@types/react-dom": "16.8.5", "@types/react-fontawesome": "=1.6.1", "@types/react-helmet": "=5.0.3", "@types/react-input-mask": "^2.0.4", "@types/react-redux": "^7.1.5", "@types/react-router-config": "=5.0.0", "@types/react-router-dom": "^5.1.3", "@types/react-select": "=3.0.2", "@types/uuid": "^3.4.6", "@types/whatwg-fetch": "^0.0.33", "app-root-path": "^2.0.1", "axios": "^0.21.1", "babel-loader": "^8.0.6", "babel-plugin-import": "^1.12.1", "body-parser": "^1.18.2", "bootstrap": "^4.3.1", "cross-env": "^5.1.3", "crypto": "^1.0.1", "customize-cra": "^0.6.0", "dotenv": "^8.1.0", "dotenv-webpack": "^1.7.0", "es6-promise": "^4.2.2", "express": "^4.17.1", "fetch-everywhere": "^1.0.5", "file-loader": "^3.0.1", "ignore-loader": "^0.1.2", "ignore-styles": "^5.0.1", "js-base64": "^2.4.3", "less": "^3.9.0", "less-loader": "^5.0.0", "lodash": "^4.17.4", "lodash.throttle": "^4.1.1", "morgan": "^1.9.1", "node-fetch": "^2.6.0", "node-sass": "^4.12.0", "nodemon": "^1.19.2", "odata-query": "6.0.0-1", "rc-steps": "^3.5.0", "re-reselect": "^3.4.0", "react": "^17.0.2", "react-app-rewire-less": "^2.1.3", "react-app-rewired": "^2.1.3", "react-autosuggest": "^10.0.2", "react-bootstrap": "^1.0.0-beta.15", "react-countdown": "^2.3.2", "react-dom": "^17.0.2", "react-dropdown-date": "^2.2.7", "react-ga": "^2.6.0", "react-helmet": "^5.2.0", "react-hook-form": "^3.28.2", "react-hotjar": "^2.0.2", "react-id-generator": "^3.0.0", "react-input-mask": "^2.0.4", "react-lines-ellipsis": "^0.14.1", "react-modal": "^3.11.1", "react-modern-calendar-datepicker": "^3.1.6", "react-owl-carousel2": "^0.3.0", "react-redux": "7.1.3", "react-router-config": "^5.1.1", "react-router-dom": "^5.1.2", "react-scripts": "3.0.1", "react-scripts-ts": "2.13.0", "react-select": "=3.0.8", "react-spinners": "=0.7.1", "redux": "=4.0.4", "redux-actions": "=2.6.5", "redux-thunk": "=2.3.0", "reselect": "=4.0.0", "serve-favicon": "=2.4.5", "ts-loader": "=6.0.4", "ts-node": "=8.3.0", "use-media": "=1.4.0", "use-react-router": "=1.0.7", "uuid": "=3.3.3", "webpack-cli": "=3.3.8", "webpack-node-externals": "=1.7.2", "whatwg-fetch": "=3.0.0" }, "scripts": { "prestart": "yarn run build", "start": "yarn start:server", "start:dev": "yarn run build && yarn start:server:dev", "start:server": "cross-env NODE_ENV=production ts-node build_server/server.js", "start:server:dev": "cross-env NODE_ENV=development ts-node build_server/server.js", "start:client": "react-app-rewired start", "build:server": "ts-node node_modules/webpack/bin/webpack.js --config webpack.server.config.js", "build:client": "react-app-rewired build", "build": "yarn run build:client && yarn run build:server", "test": "react-app-rewired test --env=jsdom", "eject": "react-app-rewired eject" }, "eslintConfig": { "extends": "react-app" }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] }, "devDependencies": { "concurrently": "=3.5.1", "style-loader": "=1.0.0", "typescript": "3.5.3" } }
排查与解决方法
1. 修复cross-env版本兼容性问题
错误栈明确指向cross-env的进程kill调用,旧版本cross-env@5.1.3与Node.js 14+在Windows环境下存在兼容性问题,新版本已修复此问题:
- 升级
cross-env到最新稳定版:yarn add cross-env@latest --save
2. 验证Yarn与Node的兼容性
错误同时涉及Yarn的进程信号处理,可尝试:
- 升级Yarn到最新1.x稳定版;
- 临时切换为npm执行启动命令,排查是否是Yarn的问题:
npm run start
3. 优化启动脚本(绕过cross-env测试)
临时改用Windows原生环境变量设置方式启动服务,验证是否是cross-env的问题:
# 在Windows cmd中执行 set NODE_ENV=production && ts-node build_server/server.js
如果此方式不崩溃,说明cross-env是核心诱因。
4. 修复服务端进程信号处理逻辑
检查build_server/server.js中是否存在Unix特有的进程信号监听(如SIGTERM),Windows不支持部分Unix信号,需添加兼容处理:
process.on('SIGINT', () => { if (process.platform === 'win32') { // Windows环境直接退出进程 process.exit(0); } else { // Unix环境保留原有逻辑 process.kill(process.pid, 'SIGINT'); } });
5. 清理依赖缓存并重新构建
旧项目依赖可能存在缓存损坏,执行以下步骤重置依赖:
# 清理Yarn缓存 yarn cache clean # 删除旧依赖与构建产物 rmdir /s node_modules rmdir /s build rmdir /s build_server # 重新安装依赖并构建 yarn install yarn run build
6. 启用调试模式捕获崩溃细节
添加Node.js调试参数,捕获崩溃时的详细上下文:
- 修改
package.json中的启动脚本:"start:server": "cross-env NODE_ENV=production node --inspect-brk ts-node build_server/server.js" - 打开Chrome浏览器访问
chrome://inspect,连接调试进程,捕获崩溃时的调用栈与变量信息。
内容的提问来源于stack exchange,提问作者Hunter91151
相关产品推荐
相关产品推荐

