1

我有一个 node.js 应用程序,它每天都连接到服务器。

在此服务器上,可以使用新版本的应用程序,如果是,则安装的应用程序下载它,检查下载是否完成,如果是,则停止自身调用 shell 脚本,将旧应用程序替换为新应用程序, 并启动它。

我正在努力启动更新脚本。

我知道我可以用 child_process_execFile 函数启动它,我这样做:

var execF = require('child_process').execFile;
var PATH = process.argv[1].substr(0, process.argv[1].lastIndexOf('/')+1),
    filename = 'newapp.js',
execF(PATH + 'up.sh', [PATH + filename], function () {console.log('done'); return ;});

up.sh,现在只是:

cat $1 > /home/pi/test

我在控制台中打印了“完成”,但没有创建测试。

我知道 execFile 创建了一个子进程,它是阻止脚本执行此操作的原因吗?

如果我成功开始这个,我知道我只需要在脚本中创建一些 cp 来让我的应用程序自动更新。

编辑:

像往常一样启动(从控制台调用脚本),它运行良好,从node.js调用时脚本不执行是否有原因?

4

2 回答 2

1

我建议您考虑使用可以自动为您执行此操作的模块,而不是重复工作。或者,至少使用他们的技术作为您自己要求的灵感。

一个例子是:https ://github.com/edwardhotchkiss/always

使用简单:

Usage: always <app.js>
=> always app.js

然后,只要您的代码更改,应用程序就会被终止并重新启动。

正如您在源代码中看到的,它使用Monitor类来监视指定的文件,然后使用spawn来启动它(当然kill,当发生更改时结束进程)。

不幸的是,[always]输出当前被硬编码到代码中,但这将是一个简单的更改/拉取请求,我确信它是可选的/可配置的。如果作者不接受您的更改,您可以只修改代码的本地副本(因为它总体上非常简单)。

于 2013-11-07T13:22:54.680 回答
0

确保当您生成/执行进程时,您正在执行将处理脚本的 shell,而不是脚本本身。

应该是这样的

execF("/usr/bin/sh", [PATH + 'up.sh', PATH + filename]);
于 2013-10-31T19:37:13.223 回答