[英]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.