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