应用程序需要完全死掉,所以我最终不会运行多个节点进程。我需要杀死节点,但我还需要启动一个新节点。 Npm开始会很棒,因为它会调用gulp并重新项目。
有一种简单的方法可以做到这一点。现在我有一个调用process.exit()的路由,但它返回
[nodemon] clean exit - 在重新启动之前等待更改
修改
我的意思是从头开始git pull,重新捆绑然后再次启动节点。
@Paul ..实际上我有一个API,我从一个使用simple-git的特定页面调用并从主分支中提取。这只会向用户发送一条消息,表示有更新。我有另一条路线是process.exit(0)。现在我把它设置在一个单一的集群中,这样一个主要的一个工人。这似乎不起作用。
我对如何使用分离的spawn过程感到有点困惑。我需要运行gulp,它将捆绑所有内容,然后启动app.js.然而,对于我的单一群集,似乎每隔一段时间就会得到一个net :: ERR_EMPTY_RESPONSE,这是不可接受的。这只是我以前从未处理过的事情,并没有看到其他人这样做过。
我最终取出了群集代码并运行它,它似乎正在工作,如果它重新绑定。虽然没有节点重启。我不相信我们需要重启节点,但我肯定会研究如何做到这一点。
答案 0 :(得分:1)
您可能需要检查pm2,这样您就可以启动/停止/重新启动节点进程。
答案 1 :(得分:1)
如果您已经在使用grunt,请检查grunt-watch并将其指向一个canary文件或已安装的目录,它会按照您的要求执行。
<强>更新强>
所以,我没有从问题的第一个版本开始,你试图让Node应用程序真正知道什么时候需要“替换”。这将需要某种轮询或检查。正确的方法取决于你的架构,但一般来说,如果你有一堆你不拥有的安装(例如其他人安装的东西,如shell应用程序或其他东西)你可以让你的应用程序调查一些资源(甚至可能是你的git repo或NPM本身,取决于代码的托管位置)来查看最新的标记版本。作为一项规则,我不会在每个标签上“自动更新”,而是我会有一些通知用户需要更新的内容,并且只有用户采取的操作才能实现,如果有用户愿意的话被影响。
也就是说,一旦应用程序知道它应该被替换,它不应该只是覆盖自己。相反,我要做的是将新标签git checkout到另一个文件夹(也许你有基于版本名称的文件夹),然后在那里运行构建过程。那时的某种验证是个好主意;确保正确下载文件并按预期运行构建。如果一切都按计划进行,我会让它自行关闭并在新路径中启动应用程序。我可能通过在分离状态下生成新进程来做到这一点,以便另一个可以在调用它之后无错误地退出。
How to detach a spawned child process in a Node.js script?
如果您正在谈论您拥有的应用程序的所有实例,我可能会进行蓝色/绿色部署,但是运行时间很长并且您的问题不清楚您在哪种情况下试图支持。
答案 2 :(得分:0)
我最终在@Paul的帮助下解决了这个问题,他有一些指导我的方向正确。
我们最终做了什么。
app.js中的&gt;服务器 这是为了搜索git进行更新并翻转布尔值
var isUpdate = false;
var checkUpdate = function(){
simpleGit.pull(function(err, data){
if(data && data.summary.changes){
isUpdate = true;
}
});
return isUpdate;
};
// if true is sent then /api/reboot will be called from the client
router.get('/api/update', function (req, res) {
res.json({isUpdate: checkUpdate()});
});
// reboot client
router.get('/api/reboot', function (req, res) {
process.exit(0);
});
gulps default和任务名为
// Easy to understand but will show start
gulp.task('default', function(callback) {
runSequence('bundle', 'chrome', 'start', callback);
});
// Launch node process
function boot() {
return exec('node app.js', function (err, stdout, stderr) {
console.log(stdout);
console.log(stderr);
}).on('exit', function () {
runSequence('bundle', boot);
});
}
// Launches server and auto-updates
gulp.task('start', function(cb){
boot()
});
在客户端上,我运行了一个间隔来检查更新,当时我要求用户更新,当他们说是的时,发送了重启。然后我告诉用户在更新完成后等待一秒钟,然后我用。重新加载页面。
$window.location.reload();
当然,在超时内,用户有时间阅读有关他们所处版本的消息。