电子杀了child_process.exec

我有一个电子应用程序使用child_process.exec来运行长时间运行的任务。 当用户在这些任务中退出应用程序时,我正在努力pipe理。

如果他们退出我的应用程序或closuressubprocess继续运行,直到他们完成,但电子应用程序窗口已经closures和退出。

有没有办法通知用户,有进程仍在运行,什么时候完成,然后closures应用程序窗口?

所有我在我的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(); } }); 

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

谢谢你的帮助

EDITED

我似乎无法获得child_process的PID,直到它完成。 这是我的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) 

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

所以,每个人的伟大的评论后,我能够更新我的代码与一些额外的工作,所以我张贴我的更新为其他人。

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); }); 

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 ); } }); }); }); 

感谢大家的帮助。

当进程结束时, ChildProcess会发出一个exit事件 – 如果您跟踪数组中的当前进程,并且在exit事件触发后让它们自己移除,那么您应该能够对剩余的运行ChildProcess.kill()当你退出你的应用程序。

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

 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(); } }); 

编辑:正如在注释中提到的shreik,你也可以只是将数组中的PID存储在数组中而不是ChildProcess对象,然后使用process.kill(pid)来杀死它们。 可能会更高效一点!

解决scheme 如果你想继续使用exec()

为了杀死exec()运行的subprocess,看看模块ps-tree 。 他们无视所发生的事情。

在UNIX中,一个进程可以通过使用退出调用来终止,并且它的父进程可以通过使用等待系统调用来等待该事件。 等待系统调用返回终止subprocess的标识符,以便父进程告诉可能有多个subprocess已经终止。 但是,如果父节点终止,那么所有的子节点都将init进程分配为新的父节点。 因此,孩子们仍然有一位家长收集他们的状态和执行统计。 (来自“操作系统概念”)

解决scheme:使用ps-tree来获取一个child_process可能启动的所有进程,这样就可以了

exec()实际上是这样工作的:

 function exec (cmd, cb) { spawn('sh', ['-c', cmd]); ... } 

所以检查一下这个例子,并根据你的需要进行调整

 var cp = require('child_process'), psTree = require('ps-tree'); var child = cp.exec("node -e 'while (true);'", function () { /*...*/ }); psTree(child.pid, function (err, children) { cp.spawn('kill', ['-9'].concat(children.map(function (p) { return p.PID }))); });