Spaces:
Running
Running
/** | |
* 服务启动脚本 | |
* 同时启动 Web 服务器和调度器 | |
*/ | |
import { spawn } from 'child_process'; | |
import { log, logError } from './utils/common-utils.js'; | |
// 存储子进程 | |
const processes = []; | |
/** | |
* 启动子进程 | |
*/ | |
function startProcess(name, command, args = []) { | |
log(`启动 ${name}...`); | |
const child = spawn('node', [command, ...args], { | |
stdio: 'inherit', | |
cwd: process.cwd() | |
}); | |
child.on('error', (error) => { | |
logError(`${name} 启动失败:`, error); | |
}); | |
child.on('exit', (code, signal) => { | |
if (code !== 0) { | |
logError(`${name} 异常退出,代码: ${code}, 信号: ${signal}`); | |
} else { | |
log(`${name} 正常退出`); | |
} | |
}); | |
processes.push({ name, process: child }); | |
return child; | |
} | |
/** | |
* 优雅关闭所有进程 | |
*/ | |
function gracefulShutdown() { | |
log('收到关闭信号,正在停止所有服务...'); | |
processes.forEach(({ name, process }) => { | |
if (!process.killed) { | |
log(`停止 ${name}...`); | |
process.kill('SIGTERM'); | |
} | |
}); | |
// 等待一段时间后强制关闭 | |
setTimeout(() => { | |
processes.forEach(({ name, process }) => { | |
if (!process.killed) { | |
log(`强制停止 ${name}...`); | |
process.kill('SIGKILL'); | |
} | |
}); | |
process.exit(0); | |
}, 5000); | |
} | |
/** | |
* 主函数 | |
*/ | |
async function main() { | |
log('🚀 启动 CloudStudio Runner 服务'); | |
log('='.repeat(50)); | |
try { | |
// 启动 Web 服务器 | |
const webServer = startProcess('Web 服务器', 'web-server.js'); | |
// 等待一下确保 Web 服务器启动 | |
await new Promise(resolve => setTimeout(resolve, 2000)); | |
// 启动调度器 | |
const scheduler = startProcess('调度器', 'scheduler.js'); | |
log('='.repeat(50)); | |
log('✅ 所有服务已启动'); | |
log('📊 Web 界面: http://localhost:7860'); | |
log('⏰ 调度器: 每10分钟执行一次任务'); | |
log('按 Ctrl+C 停止所有服务'); | |
// 监听退出信号 | |
process.on('SIGINT', gracefulShutdown); | |
process.on('SIGTERM', gracefulShutdown); | |
// 保持主进程运行 | |
process.on('exit', () => { | |
log('主进程退出'); | |
}); | |
} catch (error) { | |
logError('启动服务失败:', error); | |
process.exit(1); | |
} | |
} | |
// 运行主函数 | |
import { fileURLToPath } from 'url'; | |
import path from 'path'; | |
const __filename = fileURLToPath(import.meta.url); | |
const scriptPath = path.resolve(process.argv[1]); | |
if (path.resolve(__filename) === scriptPath) { | |
main().catch(error => { | |
logError('服务启动异常:', error); | |
process.exit(1); | |
}); | |
} | |
export { main }; | |