Nodejs 关于linux kill 掉node.js 产生的子进程

Nodejs 关于linux kill 掉node.js 产生的子进程

我在项目中,利用 var spawn = require(‘child_process’).spawn; 启动了一个新进程,为项目服务 并为此进程,写了一个守护线程, 现在想测试,守护线程,是否能正常工作, 则,当子进程挂掉的时候,守护线程自动将其重启 在winodw 上,是可以使用taskkill /pid xxxx /t 来kill掉当前进程 请问在linux 上如果kill掉当前子进程 enter image description here

利用 kill -9 3235,无用… 请问大牛们,利用什么命令可以杀掉由node.js 产生的子进程


6 回复

Node.js 关于 Linux 中 kill 掉 Node.js 产生的子进程

在 Node.js 项目中,我们经常需要启动和管理子进程。当你需要在 Linux 系统上终止一个由 Node.js 启动的子进程时,可以使用 kill 命令。但是,直接使用 kill -9 <PID> 可能不是最优雅的方法,因为它会立即终止进程而不会给进程任何清理的机会。

示例代码

假设你有一个简单的 Node.js 应用来启动子进程,并且你希望在子进程退出时自动重启它:

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

function startChildProcess() {
    const child = spawn('your_command', ['arg1', 'arg2'], {
        detached: true,
        stdio: 'ignore'
    });

    child.unref(); // 让主进程不等待子进程结束

    child.on('close', (code) => {
        console.log(`子进程关闭,退出码 ${code}`);
        startChildProcess(); // 子进程退出后自动重启
    });
}

startChildProcess();

在这个例子中,spawn 方法用于启动一个新的子进程。detached: truestdio: 'ignore' 参数使得子进程在后台运行,并且不会继承父进程的标准输入输出流。unref() 方法确保主进程不会因为子进程的存活而保持运行状态。

如何手动终止子进程

如果你需要手动终止子进程,可以通过发送信号来实现。例如,你可以发送 SIGTERM(默认信号)或 SIGKILL(强制终止)信号来终止子进程。

// 终止子进程
child.kill('SIGTERM'); // 发送 SIGTERM 信号
// 或者
child.kill('SIGKILL'); // 强制终止

守护进程和重启机制

为了确保子进程在退出后能够自动重启,可以在主进程中监听子进程的 exit 事件,并在该事件触发时重新启动子进程。如上述代码所示,child.on('close', ...) 就是用来处理这种场景的。

使用 pkill 终止进程

如果你希望从命令行终止子进程,可以使用 pkill 命令。pkill 可以通过进程名或其他属性来查找并终止进程。

pkill -f your_command_name

这将查找名为 your_command_name 的进程并终止它。注意,这里使用 -f 选项允许你通过命令行参数来匹配进程。

通过这些方法,你可以有效地管理和监控由 Node.js 启动的子进程,并确保它们在意外退出时能够自动重启。


思路没发现问题, kill 命令这样也没错, 难道是代码不对? 上代码?

这个应该不是代码问题。。 进程由var spawn = require(‘child_process’).spawn;产生 我在window上可用taskkill /pid xxxx /t 来kill掉。 在linux 上不知有啥了。 我是用netstat -ao|grep 6011 来查看子进程pid 用kill 的时候,报pid不存在

守护线程?node.JS没有线程吧。

已解决。。是kill掉phantomjs进程的。。。

在Linux系统上,你可以通过父进程ID(PPID)来终止所有子进程。你可以使用Node.js提供的process.pid获取父进程ID,然后通过Linux的kill命令来终止所有子进程。

以下是一个示例代码,展示了如何实现子进程的管理及守护线程的功能:

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

function startChildProcess() {
    const child = spawn('your_command_here', ['arg1', 'arg2'], {
        stdio: 'inherit' // 将子进程的标准输入输出重定向到父进程
    });

    child.on('exit', (code, signal) => {
        console.log(`Child process exited with code ${code} and signal ${signal}`);
        restartChildProcess();
    });

    return child;
}

let childProcess;

function start() {
    childProcess = startChildProcess();
}

function restartChildProcess() {
    if (childProcess) {
        // 获取子进程的PID
        const childPid = childProcess.pid;
        console.log(`Restarting child process with PID ${childPid}`);

        // 终止子进程及其所有子进程
        const killCommand = `kill -TERM -${childPid}`;
        require('child_process').exec(killCommand, (error, stdout, stderr) => {
            if (error) {
                console.error(`exec error: ${stderr}`);
                return;
            }
            console.log(`stdout: ${stdout}`);
            start(); // 重新启动子进程
        });
    }
}

// 启动守护进程
start();

// 模拟杀死子进程
setTimeout(() => {
    restartChildProcess();
}, 5000);

在这个例子中,restartChildProcess函数通过向子进程发送-TERM信号来终止它以及其所有子进程。-TERM信号允许进程执行清理操作并优雅地退出。如果需要强制终止进程,可以使用-KILL信号,但请注意这不会给进程任何机会执行清理操作。

确保将your_command_here替换为你实际使用的命令。此外,这段代码使用了exec来执行shell命令。如果你更喜欢纯JavaScript的方法,可以使用process.kill(childPid, 'SIGTERM')代替。

回到顶部