运行gulp ngrok-serve时出现kill EPERM错误,请求技术支持
解决Gulp启动Ngrok时的EPERM错误问题
错误现象
运行gulp ngrok-serve --debug时出现权限错误:
>>gulp ngrok-serve --debug [16:34:54] Found additional Yo Teams plugin: yoteams-deploy [16:34:54] Using gulpfile ~\OneDrive - HEGELMAT\Desktop\Projects\LEARN-MSTEAMS-MEETINGS\gulpfile.js [16:34:54] Starting 'ngrok-serve'... [16:34:54] Starting 'start-ngrok'... [16:34:54] [NGROK] starting ngrok... [16:34:54] 'start-ngrok' errored after 90 ms [16:34:54] Error: kill EPERM at ChildProcess.kill (node:internal/child_process:511:26) at setAuthtoken (C:\Users\hegel\OneDrive - XXXXX\Desktop\Projects\LEARN-MSTEAMS-MEETINGS\node_modules\ngrok\src\process.js:149:11) at process.processTicksAndRejections (node:internal/process/task_queues:105:5) at async Object.connect (C:\Users\hegel\OneDrive - XXXXX\Desktop\Projects\LEARN-MSTEAMS-MEETINGS\node_modules\ngrok\index.js:18:5) [16:34:54] Finished 'ngrok-serve' after 99 ms
手动启动正常
直接执行Ngrok命令可以正常运行:
>> ngrok http 3007 --url xxxxx.ngrok.app
排查思路与解决步骤
- 检查环境变量配置:Gulp任务依赖
PORT、NGROK_AUTH等环境变量,确认process.env.PORT值为3007(与手动启动一致),可暂时注释authtoken配置,测试是否为认证令牌导致的权限问题。 - 清理残留Ngrok进程:EPERM错误常因残留进程占用资源导致,打开任务管理器结束所有
ngrok.exe进程后,重新运行Gulp命令。 - 调整Gulp任务配置:修改
ngrokTasks.js中的Ngrok配置,与手动启动参数对齐,比如手动指定端口、暂时注释非必要配置:const conf = { addr: 3007, // 替换环境变量,手动指定端口 // subdomain: process.env.NGROK_SUBDOMAIN, // region: process.env.NGROK_REGION, // authtoken: process.env.NGROK_AUTH }; - 修复Ngrok包权限或重新安装:以管理员身份运行命令行执行Gulp命令;删除
node_modules和package-lock.json后重新执行npm install;尝试升级/降级ngrok包版本。 - 检查Ngrok可执行文件权限:确认当前用户对
node_modules/ngrok/bin下的Ngrok可执行文件有读写和执行权限。
附:原始Ngrok任务代码
"use strict"; // Copyright (c) Wictor Wilén. All rights reserved. // Licensed under the MIT license. // SPDX-License-Identifier: MIT var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ngrokTasks = void 0; const fancy_log_1 = __importDefault(require("fancy-log")); const ngrok_1 = __importDefault(require("ngrok")); const _1 = require("."); const plugin_error_1 = __importDefault(require("plugin-error")); const ngrokTasks = (gulp, config) => { gulp.task("start-ngrok", (cb) => { (0, fancy_log_1.default)("[NGROK] starting ngrok..."); const conf = { subdomain: process.env.NGROK_SUBDOMAIN, region: process.env.NGROK_REGION, addr: process.env.PORT, authtoken: process.env.NGROK_AUTH }; ngrok_1.default.connect(conf).then((url) => { (0, fancy_log_1.default)("[NGROK] Url: " + url); if (!conf.authtoken) { (0, fancy_log_1.default)("[NGROK] You have been assigned a random ngrok URL that will only be available for this session. You will need to re-upload the Teams manifest next time you run this command."); } let hostName = url.replace("http://", ""); hostName = hostName.replace("https://", ""); (0, fancy_log_1.default)("[NGROK] PUBLIC_HOSTNAME set to: " + hostName); process.env.PUBLIC_HOSTNAME = hostName; (0, fancy_log_1.default)("[NGROK] Inspect Url: " + ngrok_1.default.getUrl()); cb(); }).catch((err) => { cb(new plugin_error_1.default("yoteams-build.core", err)); }); }); gulp.task("ngrok-serve", (0, _1.dependencies)(gulp, "ngrok-serve", "start-ngrok", "manifest", "serve")); }; exports.ngrokTasks = ngrokTasks;
内容的提问来源于stack exchange,提问作者hegel mat
相关产品推荐
相关产品推荐

