如何使用 javascript 杀死 linux child_process.spawn?

How to kill a linux child_process.spawn using javascript?

var child_process = require('child_process');

if (typeof ffmpegrec == "undefined" || ffmpegrec == null)
{
    var ffmpegrec = '';
}


if(record === "1")
{
    ffmpegrec = child_process.spawn("ffmpeg",[
        "-re",                   // Real time mode
        "-f","x11grab",          // Grab screen
        "-framerate","60",              // Framerate
        "-s",width+"x"+height,   // Capture size
        "-i",":"+screen+"+"+top+","+left,        // Capture offset
        "-vb","1024k",            // Target bit rate
        "-f","mpeg1video",             // File format
        "/home/CloudGaming/webContent/recordedVideos/test.mpg"]);
}
else if(record === "0")
{
    ffmpegrec.kill();
}

我正在发送信号 1 来录制视频流,而发送 0 信号来停止视频流。录制就像一个魅力,但这个过程不能被终止。请帮忙。提前致谢!

我正在采用更宏观的方法来展示如何使用 spawn() 等来管理进程。

我认为您犯了一个根本性错误,因为您运行将此作为脚本完成以启动该过程,并期望能够再次运行它以停止这个过程。当脚本第一次停止时,ffmpegrec 不再有任何意义; JavaScript 引擎及其所有全局变量都已处理。所以在第二个 运行 上,现在你将 ffmpegrec 初始化为一个空字符串,所以它是某种 Object。这是巫毒编码。

这是一个保持活动状态的演示脚本,因此它可以在生成子进程后向其发出信号。您必须找到一种方法来 保留脚本 运行ning 并以某种方式发送它 "start" 和 "stop" 命令,然后将这些命令转发给子 ffmpeg 进程.这是一个由您决定的设计挑战。然后,您必须使用适当的错误和输出侦听器来处理子进程,您需要使用函数抽象,将所有变量设置在正确的位置,不要混合类型,并检查错误。以下作品。看看这是否为您解决了所有问题。

var child_process = require('child_process');
var ffmpegrec = null;

function record(setting) {
    if ( setting === 1 ) {
        if ( ffmpegrec !== null ) {
            console.log('Error! ffmpeg already running');
        }
        else {
            // I don't have ffmeg installed, so simulating a long process instead                                                                      
            ffmpegrec = child_process.spawn('sh', ['-c', 'sleep 10']);
            ffmpegrec.on('close', function(code, signal) {
                console.log('child process terminated due to receipt of signal ' + signal + ' or code ' + code);
                ffmpegrec = null;
            });
            ffmpegrec.stdout.on('data', function (data) {
                console.log('stdout: ' + data);
            });
            ffmpegrec.stderr.on('data', function (data) {
                // important to monitor ffmegprec's complaints
                console.log('stderr: ' + data);
            });
            // Can track using "ps" unix util, etc.
            console.log('Initiated recording on PID ' + ffmpegrec.pid);
        }
    }
    else if ( setting === 0 ) {
        if ( ffmpegrec === null ) {
            console.log('Error! Tried to stop recording and no recording active');
        }
        else {
            ffmpegrec.kill('SIGINT');
            // ffmpegrec will become null if and when signal delivery succeeds
            console.log('Terminated recording');
        }
    }
    else {
        console.log('Error! Invalid value for setting: ' + setting);
    }
}


console.log('Starting');
record(0); // Can't stop if not yet started; 1st error                                                                                                 
record(1); // OK                                                                                                                                       
record(1); // Can't start if already started; 2nd error                                                                                                

setTimeout(function() { record(0); /* OK to stop now */ }, 5000);