通过在NodeJS中执行PHP脚本来重新启动NodeJS

Restarting NodeJS by executing a PHP script from within NodeJS

本文关键字:NodeJS 脚本 本来 重新启动 PHP 执行      更新时间:2023-09-26

我在尝试更新文件夹并再次部署其内容时遇到问题。我必须使用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节点",我会让很多人对我杀死他们的服务器感到愤怒。

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

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

然后,您可以制作一个bash脚本来执行所有命令,并在环境变量中给定PID。

1) 忘记更新。php

2) 路线

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

3) 更新.sh

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队列中的pull请求。如果您使用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);
  }  
});

或者,正如另一位读者所建议的那样,你可以也可能应该使用githook。一个很好的部署方式是进行裸回购。