通过在NodeJS

时间:2015-12-08 10:11:24

标签: javascript php node.js

我在尝试更新文件夹并再次部署其内容时遇到问题。我必须使用NodeJS并使用端口8080。我试图创建一个php脚本(update.php):

<?php
echo exec("git pull");
echo exec("node app.js");
?>

现在我想启动NodeJS脚本进行更新,最终目标是能够重启服务器。

我使用快递模块:

app.get('/Update', function(req,res) {
   exec("php update.php", function(error, stdout, stderr) {
      process.exit(0);
   }
}

问题是NodeJS服务器在从脚本获得响应但是脚本尝试启动NodeJS服务器时退出。这显然不会发生,因为它已经在指定的端口上运行。

现在我在谷歌上发现使用名为“nodemon”的模块&#39;但是我没有获得sudo访问权限,所以安装它是不可能的。其他结果正在使用

ps aux | grep node
kill -9 PROCESS_ID

这也会产生问题,因为很难配置PHP脚本来杀死指定的进程,但除此之外,还有其他NodeJS服务器在我给出的父文件夹的其他子文件夹中运行。这意味着如果我使用&#39; killall node&#39;我杀了他们的服务器让很多人生气。

使用端口8080解决此问题的最佳方法是什么,并希望在访问某个链接时部署Github存储库中的更改?

2 个答案:

答案 0 :(得分:0)

您可以通过Node.js命令process.pid获取节点的进程ID。

然后,您可以创建一个执行所有命令的bash脚本,并在环境变量中提供PID。

1)忘记update.php

2)路线

app.get('/update', function(req, res) {
  var spawn = require('child_process').spawn;
  spawn('sh', [ 'update.sh' ], {
    env: { NODE_PID: process.pid }
  });
});

3)update.sh

git pull
kill -9 $NODE_PID
node app.js

答案 1 :(得分:0)

您可以使用几种不同的方法。我建议使用作业队列,以便您永远不必重新启动该过程。使用像Faye这样的快递应用程序可以向王菲服务器发送更新消息......

app.get('/update', function (req, res) {

  // connect to local service on 8000
  var client = new faye.Client('http://localhost:8000/');

  client.publish('/update', {
    message: 'pull'
  });

  res.sendStatus(200);
});

您的服务器将接受以下请求...

var server = http.createServer(),
bayeux = new faye.NodeAdapter({mount: '/'});

bayeux.attach(server);

server.listen(8000);

您的订阅者应用程序可以侦听/ update队列以获取请求。如果你使用forever或pm2运行它,你的问题就解决了。

...订户

var client = new faye.Client('http://localhost:8000/');

client.subscribe('/update', function (message) {
  exec("cd /your/working/dir && git pull origin master", function(error, stdout, stderr) {
    process.exit(0);
  }  
});

或者正如另一位读者建议你可以并且可能应该使用git hooks。一个很好的部署方式是拥有一个裸仓库。