Node.js启动更新程序并关闭主程序

时间:2019-05-22 18:23:15

标签: javascript node.js spawn

我通过ping某个URL来检查我的应用程序是否有更新,ping此URL会返回我是否需要更新。

现在,我有一个Powershell文件,它实际上可以处理更新,因此,我试图从我的应用程序内部启动此Powershell文件。

我已经开始工作了,我可以生成我的更新程序文件,它将运行通过,一切都很好。但是,我的应用程序始终保持打开状态,这意味着更新程序完成后,我将有2个实例在运行。

在我看来,显而易见的解决方案是,如果找到更新(在生成更新程序之后),则关闭应用程序。

这是我的代码:

child = spawn("powershell.exe",['-ExecutionPolicy', 'ByPass', '-File', require("path").resolve(__dirname, '../../../../updater.ps1')]);
child.unref();

self.close();

但是,当我尝试关闭应用程序时,似乎从未启动过更新程序。或者更确切地说,我相信它已经启动,但是在主应用程序关闭时被关闭了。

我有child.unref()行,我认为该行应使生成的窗口未附加到主应用程序上,但更新程序不会保持打开状态。

我还尝试将{detached: true}添加为spawn()命令的第3个参数,但这并没有改变其运行方式。

如何生成与我的应用程序完全分开的更新程序?

1 个答案:

答案 0 :(得分:1)

要启动与您的应用程序分离的更新,我认为您应该使用脚本而不是内联参数。这将确保操作系统创建与您的节点应用程序分开的进程。例如:

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文件中。由于主要过程将等待孩子完成。

因此,一切都取决于您愿意实现的目标。第一个解决方案并不漂亮,但是它将真正启动您节点应用程序之外的其他东西。