我有一个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调用脚本时是否有理由不执行?
答案 0 :(得分:1)
我建议您考虑使用一个可以自动执行此操作的模块,而不是重复工作。或者,至少使用他们的技术作为你自己的要求的灵感。
一个例子是:https://github.com/edwardhotchkiss/always
使用简单:
Usage: always <app.js>
=> always app.js
然后,只要您的代码发生变化,应用就会被杀死并重新启动。
正如您在源代码中看到的那样,它使用Monitor
类来观看指定的文件,然后使用spawn
启动它(当然还有kill
来结束发生变化时的过程。)
不幸的是,[always]
输出当前被硬编码到代码中,但它将是一个简单的更改/拉取请求我肯定会使其成为可选/可配置的。如果作者不接受您的更改,您只需修改代码的本地副本(因为它总体上非常简单)。
答案 1 :(得分:0)
确保在生成/执行正在执行将处理脚本而不是脚本本身的shell的进程时。
应该像
execF("/usr/bin/sh", [PATH + 'up.sh', PATH + filename]);