File size: 2,616 Bytes
9e13dac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/env node

/**
 * 服务启动脚本
 * 同时启动 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 };