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

标签 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() 命令的第三个参数,但它并没有改变它的方式正在运行。

我怎样才能生成完全独立于我的应用程序的更新程序?

最佳答案

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

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

上面的代码将强制 Node 退出(2 秒后),但就在它启动 bash 脚本之前(将等待 5 秒以运行 ls 命令)。运行此代码会生成 2 个输出文件(out.log 和 out2.log)。第一个 (out.log) 是 Node 应用程序调用子进程的输出,而第二个 (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 文件中。由于主进程将等待子进程完成。

因此,一切都取决于您愿意实现的目标。第一个解决方案并不漂亮,但会启动一些与您的 Node 应用程序完全不同的东西。

关于javascript - Node.js 启动更新器并关闭主程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56262833/

相关文章:

javascript - 使用 JavaScript 将元素添加到 html 多级列表

javascript - 如何使用 getAllResponseHeaders 方法创建一个 JSON 对象

javascript - 在 unicode 问题上用正则表达式替换/替换所有

node.js - Nodejs bcrypt 比较无法正常工作

javascript - NodeJS : Events on child processes

javascript - 网页不呈现使用 Javascript 添加的图片

javascript - 为什么第 27 行在第 24 行之前执行?

javascript - 如何 fork /复制流

python - 当内部和内部通信器合并时,使用 Spawn() 从 python 生成的 Fortran 子进程(或 C++ 或 python)不会断开连接

c++ - 如何找出子进程是否仍在运行?