UNPKG

crootfast

Version:

大前端工程化命令行脚手架

68 lines (59 loc) 1.83 kB
const { spawn } = require('child_process'); /** * 启动一个子进程并在指定时间后关闭它。 * @param {string} command 要执行的命令。 * @param {number} timeout 关闭子进程前等待的超时时间(毫秒)。 */ function runProcessTimeout(command, timeout = (1000 * 60) * 5) { return new Promise((resolve, reject) => { let timer; // return new Promise((resolve, reject) => { // 分割命令以获取基础命令和参数 // const parts = command.split(/\s+/); // const baseCommand = parts[0]; // const args = parts.slice(1); // // 使用 spawn 启动子进程 // const subprocess = spawn(baseCommand, args); // 使用 spawn 启动子进程,并通过 shell 执行命令 const subprocess = spawn(command, { shell: true }); // 监听子进程的 stdout 和 stderr subprocess.stdout.on('data', data => { console.log(`stdout: ${data}`); }); subprocess.stderr.on('data', data => { console.error(`stderr: ${data}`); }); subprocess.on('error', (err) => { console.error(command, '启动子进程失败:', err); reject(err); }); // 监听退出事件 subprocess.on('close', (code) => { // 关闭超时逻辑 if (timer) { clearTimeout(timer); timer = undefined; } resolve({ code, subprocess }); console.log(`${command} command close: Child process exited with code ${code}`); }); // 设置超时后关闭子进程 if (timer) { clearTimeout(timer); timer = undefined; } timer = setTimeout(() => { subprocess.kill(); // 发送 SIGTERM console.log(`Timeout Subprocess killed after ${timeout} ms`); resolve(); }, timeout); }) } module.exports = { runProcessTimeout }