Electron-Node.js 启动外部应用程序或文件后退出应用程序

分享于2022年07月17日 electron javascript node.js 问答
【问题标题】:Electron-Node.js 启动外部应用程序或文件后退出应用程序(Electron-Node.js Quit app after launching external app or file)
【发布时间】:2022-01-05 10:37:20
【问题描述】:

启动外部文件或应用程序后是否可以退出主应用程序?

const child = require('child_process').execFile;
const fs = require('fs');
if (fs.existsSync(updateFile)) {
   child(updateFile, function(err, data) { }); //start the update.exe
   app.quit(); //quit the app
}

我正在尝试从 temp 目录打开我的应用程序 updater.exe 以安装新更新。由于某种原因,我无法使用 autoUpdater

updater.exe 是使用 C#.net 创建的,它只是在下载后用新文件替换旧文件,但在主应用程序仍在运行时我不能这样做。我正在考虑从 C# .net Process 终止应用程序,但这对我来说感觉不太合适。

Electron-Node.js 中使用上面的代码, updater.exe 在调用 app.quit() 后也会退出,因为它只是主应用程序的子应用程序。替代方法是什么?

PS:这只支持Windows。 Windows 10 11 更具体。


【解决方案1】:

感谢 @AlexanderLeither ,原来 child_process.spawn() 中提供了一个选项 detached

这使得子进程可以在父进程退出后继续运行。

const child = require('child_process').spawn;
const subprocess = child(updateFile, {
  detached: true,  //Continue running after the parent exits.
  stdio: 'ignore'  
});  
subprocess.unref(); //To prevent the parent from waiting for a given subprocess to exit
app.quit();

另外,由于某种原因,当我尝试在 Taskmanager 中查看时,有四个电子进程。我不得不在我的 C# .net 中使用 Process 来杀死它,以避免替换文件时出现IO 错误。

while(true) { //don't stop killing untill no more process with the same name.
    try {
        Process[] process = Process.GetProcessesByName("TestProject"); //TestProject is the name of my current project and is in the TaskManager
        if(process.Length < 1) break; //if the process doesn't exist then break this loop. 
        process[0].Kill(); //if the process exist, kill it
        process[0].WaitForExit(); //wait until the process exits
    } catch(Exception) {
        //this will throw an exception if the same process is trying to kill while it is being kill, that's okay.
    }
}