电子杀死child_process.exec

tjm*_*gis 12 node.js electron

我有一个电子应用程序,用于child_process.exec运行长时间运行的任务.当用户在这些任务期间退出应用程序时,我很难管理.

如果他们退出我的应用程序或点击关闭,子进程将继续运行直到完成,但电子应用程序窗口已关闭并退出.

有没有办法通知用户有进程仍在运行,何时完成然后关闭应用程序窗口?

我所拥有的main.js只是标准代码:

// Quit when all windows are closed.
app.on('window-all-closed', function() {
    // On OS X it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform != 'darwin') {
        app.quit();
    }
});
Run Code Online (Sandbox Code Playgroud)

我应该在某处添加支票吗?

谢谢你的帮助

EDITED

我似乎无法获得它的PID,child_process直到它完成.这是我的child_process代码

var loader = child_process.exec(cmd, function(error, stdout, stderr) {
    console.log(loader.pid)
    if (error) {
        console.log(error.message);
    }
    console.log('Loaded: ', value);
});
Run Code Online (Sandbox Code Playgroud)

我应该尝试以不同的方式获得它吗?

tjm*_*gis 15

因此,在每个人都发表了很好的评论后,我能够通过一些新增功能来更新我的代码,以便让它发挥作用,因此我会为其他人发布我的更新.

1)从child_process.exec更改为child_process.spawn

var loader = child_process.spawn('program', options, { detached: true })

2)使用Electron ipcRenderer从我的模块与main.js脚本进行通信.这允许我将PID发送到main.js

ipcRenderer.send('pid-message', loader.pid);

ipcMain.on('pid-message', function(event, arg) {
  console.log('Main:', arg);
  pids.push(arg);
});
Run Code Online (Sandbox Code Playgroud)

3)将这些PID添加到数组中

4)在我的main.js中,我添加了以下代码,以在退出应用程序之前终止数组中存在的任何PID.

// App close handler
app.on('before-quit', function() {
  pids.forEach(function(pid) {
    // A simple pid lookup
    ps.kill( pid, function( err ) {
        if (err) {
            throw new Error( err );
        }
        else {
            console.log( 'Process %s has been killed!', pid );
        }
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助.


Joe*_*lay 5

ChildProcessexit当进程完成时发出一个事件 - 如果您跟踪数组中的当前进程,并在exit事件触发后让它们自行删除,那么您应该能够在退出应用程序时刚刚foreach运行剩余的进程ChildProcess.kill()

这可能不是 100% 的工作代码/不是最好的做事方式,因为我现在无法测试它,但它应该足以让你走上正确的道路。

var processes = [];

// Adding a process
var newProcess = child_process.exec("mycommand");
processes.push(newProcess);
newProcess.on("exit", function () {
  processes.splice(processes.indexOf(newProcess), 1);
});

// App close handler
app.on('window-all-closed', function() {
  if (process.platform != 'darwin') {
    processes.forEach(function(proc) {
      proc.kill();
    });

    app.quit();
  }
});
Run Code Online (Sandbox Code Playgroud)

编辑:正如 shreik 在评论中提到的,您也可以将 PID 存储在数组中而不是ChildProcess对象中,然后用于process.kill(pid)杀死它们。可能效率会高一些!

  • 我一直收到一个错误说 proc.kill(); 不是函数 (2认同)