繁体   English   中英

通过从NodeJS内部执行PHP脚本来重新启动NodeJS

[英]Restarting NodeJS by executing a PHP script from within NodeJS

我在尝试更新文件夹并再次部署其内容时遇到问题。 我必须使用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”的模块,但是我没有sudo访问权限,因此安装它是不可能的。 其他结果正在使用

ps aux | grep node
kill -9 PROCESS_ID

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

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

您可以通过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)更新

git pull
kill -9 $NODE_PID
node app.js

您可以使用几种不同的方法。 我建议您使用作业队列,这样您就不必重启进程。 使用Faye之类的快捷应用程序可以将更新消息发送到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队列中的拉取请求。 如果您使用everever或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。 部署的一种好方法是拥有裸仓库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM