Node.js 启动更新程序并关闭主程序
Node.js start updater and close main program
我正在通过 ping 某个 URL 检查我的应用程序是否有更新,ping 这个 URL returns 是否需要更新。
现在,我有一个实际处理更新的 powershell 文件,所以我试图从我的应用程序内部启动这个 powershell 文件。
我有这个工作,我可以生成我的更新程序文件,它将 运行 通过,一切都很好。但是,我的应用程序一直保持打开状态,这意味着一旦更新程序完成,我将拥有它的 2 个实例 运行ning.
在我看来,最明显的解决方案是在发现更新时关闭应用程序(在生成更新程序之后)。
这是我的代码:
child = spawn("powershell.exe",['-ExecutionPolicy', 'ByPass', '-File', require("path").resolve(__dirname, '../../../../updater.ps1')]);
child.unref();
self.close();
但是,当我尝试关闭应用程序时,更新程序似乎从未启动过。或者更确切地说,我相信它已启动但在主应用程序关闭时关闭。
我有行 child.unref()
,我认为它应该使生成的 window 不附加到主应用程序,但更新程序不会保持打开状态。
我也尝试过添加 {detached: true}
作为我的 spawn()
命令的第三个参数,但它并没有像 运行ning 那样产生影响。
如何生成完全独立于我的应用程序的更新程序?
要启动与您的应用程序分开的更新,我认为您应该使用脚本而不是内联参数。这将确保 OS 从您的节点应用程序创建一个单独的进程。例如:
var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');
var child = spawn('./myscript.sh', [], {
detached: true,
stdio: [ 'ignore', out, err ]
});
child.unref();
setTimeout(function(){
process.exit();
}, 1000);
myscript.sh 看起来像这样:
sleep 5; ls >> out2.log
上面的代码将强制节点退出(2 秒后),但就在它启动一个 bash 脚本之前(它将等待 5 秒到 运行 ls
命令)。 运行 此代码生成 2 个输出文件(out.log 和 out2.log)。第一个 (out.log) 是节点应用程序调用子进程的输出,而第二个 (out2.log) 是从分离的脚本重定向脚本的结果。
更好更优雅的方法是使用 on
函数。但这意味着你的主进程实际上会等待子进程完成执行。例如:
var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');
var child = spawn('ls', [], {
detached: true,
stdio: [ 'ignore', out, err ]
});
child.on('exit', (code) => {
console.log(`Child exited with code ${code}`);
});
child.unref();
在第二个示例中,ls
结果将保存在 out.log
文件中。由于主进程将等待子进程完成。
所以一切都取决于你愿意实现什么。第一个解决方案并不漂亮,但会启动一些与您的节点应用程序完全不同的东西。
我正在通过 ping 某个 URL 检查我的应用程序是否有更新,ping 这个 URL returns 是否需要更新。
现在,我有一个实际处理更新的 powershell 文件,所以我试图从我的应用程序内部启动这个 powershell 文件。
我有这个工作,我可以生成我的更新程序文件,它将 运行 通过,一切都很好。但是,我的应用程序一直保持打开状态,这意味着一旦更新程序完成,我将拥有它的 2 个实例 运行ning.
在我看来,最明显的解决方案是在发现更新时关闭应用程序(在生成更新程序之后)。
这是我的代码:
child = spawn("powershell.exe",['-ExecutionPolicy', 'ByPass', '-File', require("path").resolve(__dirname, '../../../../updater.ps1')]);
child.unref();
self.close();
但是,当我尝试关闭应用程序时,更新程序似乎从未启动过。或者更确切地说,我相信它已启动但在主应用程序关闭时关闭。
我有行 child.unref()
,我认为它应该使生成的 window 不附加到主应用程序,但更新程序不会保持打开状态。
我也尝试过添加 {detached: true}
作为我的 spawn()
命令的第三个参数,但它并没有像 运行ning 那样产生影响。
如何生成完全独立于我的应用程序的更新程序?
要启动与您的应用程序分开的更新,我认为您应该使用脚本而不是内联参数。这将确保 OS 从您的节点应用程序创建一个单独的进程。例如:
var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');
var child = spawn('./myscript.sh', [], {
detached: true,
stdio: [ 'ignore', out, err ]
});
child.unref();
setTimeout(function(){
process.exit();
}, 1000);
myscript.sh 看起来像这样:
sleep 5; ls >> out2.log
上面的代码将强制节点退出(2 秒后),但就在它启动一个 bash 脚本之前(它将等待 5 秒到 运行 ls
命令)。 运行 此代码生成 2 个输出文件(out.log 和 out2.log)。第一个 (out.log) 是节点应用程序调用子进程的输出,而第二个 (out2.log) 是从分离的脚本重定向脚本的结果。
更好更优雅的方法是使用 on
函数。但这意味着你的主进程实际上会等待子进程完成执行。例如:
var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./out.log', 'a');
var child = spawn('ls', [], {
detached: true,
stdio: [ 'ignore', out, err ]
});
child.on('exit', (code) => {
console.log(`Child exited with code ${code}`);
});
child.unref();
在第二个示例中,ls
结果将保存在 out.log
文件中。由于主进程将等待子进程完成。
所以一切都取决于你愿意实现什么。第一个解决方案并不漂亮,但会启动一些与您的节点应用程序完全不同的东西。