Nodejs 求个child_process自动重启(crash不会引起主进程退出,并自动重启)的代码示例

Nodejs 求个child_process自动重启(crash不会引起主进程退出,并自动重启)的代码示例

4 回复

当然可以!以下是一个简单的 Node.js 示例代码,它展示了如何使用 child_process 模块来创建子进程,并在子进程崩溃时自动重启。这样,主进程不会因为子进程的崩溃而退出。

示例代码

const { spawn } = require('child_process');
const path = require('path');

// 子进程的路径和参数
const childProcessPath = path.join(__dirname, 'child.js');

// 创建子进程
let child;

function startChild() {
    // 创建子进程
    child = spawn('node', [childProcessPath]);

    // 监听子进程的退出事件
    child.on('exit', (code, signal) => {
        console.log(`子进程退出,退出码: ${code}, 退出信号: ${signal}`);
        console.log('尝试重启子进程...');
        // 递归调用启动子进程的函数
        setTimeout(startChild, 1000);
    });

    // 监听子进程的标准输出
    child.stdout.on('data', (data) => {
        console.log(`子进程输出: ${data.toString()}`);
    });

    // 监听子进程的标准错误输出
    child.stderr.on('data', (data) => {
        console.log(`子进程错误输出: ${data.toString()}`);
    });
}

// 启动子进程
startChild();

解释

  1. 引入模块

    • spawn 函数用于创建子进程。
    • path 模块用于处理文件路径。
  2. 定义子进程路径

    • childProcessPath 是子进程脚本的路径。在这个例子中,子进程脚本为 child.js
  3. 创建子进程

    • spawn('node', [childProcessPath]) 创建了一个新的子进程,运行 child.js 脚本。
  4. 监听子进程退出事件

    • child.on('exit', ...) 监听子进程退出事件。当子进程退出时,会打印退出码和信号,并尝试重新启动子进程。
  5. 定时重启

    • setTimeout(startChild, 1000); 设置一个延迟,以便在子进程退出后等待一段时间再重新启动。
  6. 监听标准输出和错误输出

    • child.stdout.on('data', ...)child.stderr.on('data', ...) 分别监听子进程的标准输出和错误输出。

子进程示例 (child.js)

console.log('子进程开始运行...');

// 故意让子进程崩溃
process.exit(1);

这个子进程会在启动后立即退出,主进程将根据上面的代码自动重启它。你可以根据需要修改 child.js 中的内容,以测试不同的场景。


是要实现graceful shutdown之类的吗?

当然可以。你可以使用 child_process 模块来创建子进程,并通过监听子进程的退出事件来实现自动重启功能。以下是一个简单的示例代码,展示了如何实现这一功能:

const { fork } = require('child_process');
const path = require('path');

function startChildProcess() {
    // 创建子进程
    const child = fork(path.join(__dirname, 'child.js'));
    
    // 监听子进程退出事件
    child.on('exit', (code) => {
        console.log(`子进程退出,退出码: ${code}`);
        // 子进程异常退出时重新启动
        if (code !== 0) {
            console.log('子进程异常退出,将自动重启...');
            startChildProcess();
        }
    });
}

// 启动第一个子进程
startChildProcess();

在这个示例中,child.js 是你要运行的子进程文件。如果子进程异常退出(即退出码不为0),主进程会捕获到 exit 事件并重新启动子进程。

另外,确保你的 child.js 文件能够正确执行,并且在发生错误时能够抛出异常或非零退出码,以便主进程能够检测到它已退出并且需要重启。

如果你想要更复杂的逻辑,比如限制重启次数或者在一定时间内多次崩溃后停止重启,你可以根据这些基本示例进行扩展。

回到顶部