我在尝试更新文件夹并再次部署其内容时遇到问题。我必须使用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存储库中的更改?
答案 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。一个很好的部署方式是拥有一个裸仓库。