【问题标题】:Killing child process in node.js/electron在 node.js/electron 中杀死子进程
【发布时间】:2019-05-30 19:26:52
【问题描述】:

我在 node.js 中打开一个子进程以使用 VLC 启动 RTSP 流。然后,我想在电子应用程序发送命令后终止该进程。

这是我编写的代码。有什么我做错了,因为即使代码运行,子进程也不会被杀死。我检查了 cam 不是未定义的,它实际上进入了那个代码块。

const { dialog, ipcMain, BrowserWindow} = require('electron');
const {url} = require('url');
var net = require('net');
var spawn = require('child_process').exec;
var cam;

class streamHandler { 
    constructor(){
        this.sendAndReceiveMessageListener();
    }

    sendAndReceiveMessageListener(){
        ipcMain.on('http-request', (event)=>{
            let message = "Starting the video stream";
            cam = spawn('"C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe" --qt-start-minimized  rtsp://192.168.0.75/live --sout "#transcode{acodec=vorb, vcodec=theo}:standard{access=http, mux=ogg, dst=localhost:8090/}"', function(error, stdout, stderr){});
            event.sender.send('http-response', (message));
        });

        ipcMain.on('http-end-stream-request', (event)=>{
            let message = "Video stream ended.";
            if (typeof cam !== 'undefined' && cam !== null){
                cam.kill('');
            }

            event.sender.send('http-end-stream-response', (message));

        });
    }

    spawnVLC(){
        console.log()
    }
}

module.exports = new streamHandler();

【问题讨论】:

  • “即使代码运行通过”。只是为了确保我理解,您是否确认正在调用 cam.kill('')?其次,你为什么将一个空字符串传递给kill?只需致电cam.kill()
  • 嗨,我尝试使用 cam.kill(),仍然无法正常工作。我已经验证了 cam.kill() 确实被调用它只是没有做任何事情,我试图理解为什么。我已经尝试了 kill() 函数也可以采用的所有不同的字符串参数,但没有任何运气。
  • 当您生成进程时,您是否还可以为close 事件和error 事件添加处理程序,并查看在调用kill() 时是否有任何处理程序被命中?

标签: node.js electron


【解决方案1】:

这可能发生的原因之一是因为您生成的子进程(RTSP stream using VLC - 我们称之为子进程“A”)正在创建其他子进程(“B”、“C”等)当您尝试杀死子进程“A”时,它不会被杀死。

当子线程执行完毕删除后,孙线程成为僵尸进程,process.kill()无法删除。

您可以使用以下方法:

以分离模式生成子进程,以便您可以杀死所有子进程。

    var spawn = require('child_process').spawn;
    var child = spawn('my-command', {detached: true});
    process.kill(-child.pid);

请在pid 之前注意-。这会将pid 转换为一组pids 用于进程kill() 方法。

相关链接:

[如何]https://azimi.me/2014/12/31/kill-child_process-node-js.html

[相关问题]https://github.com/nodejs/help/issues/1389

[文档]https://nodejs.org/api/child_process.html#child_process_subprocess_kill_signal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2010-12-08
    • 2019-04-20
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多