crootfast
Version:
大前端工程化命令行脚手架
68 lines (59 loc) • 1.83 kB
JavaScript
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
}