簡體   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