pm2 start app.js 可以成功。但如果开启多个 cluster , pm2 start app.js -i 4 就会失败。请问如何解决
1
airyland 2016-07-04 01:54:53 +08:00 via iPhone
作为写代码的,失败不给出错信息别人咋解决?
|
2
DoraJDJ 2016-07-04 01:59:38 +08:00 via Android
猜测是开了四个实例,监听端口却是相同的,然后互相冲突。
|
3
wico77 OP @airyland PM2: 2016-07-03 13:46:11: App name:index id:0 online
index-0 (err): at handleMessage (child_process.js:327:10) index-0 (err): at Pipe.channel.onread (child_process.js:355:11) index-0 (err): Error: bind EADDRINUSE index-0 (err): at exports._errnoException (util.js:746:11) index-0 (err): at cb (net.js:1207:33) index-0 (err): at rr (cluster.js:595:14) index-0 (err): at Worker.<anonymous> (cluster.js:566:9) index-0 (err): at process.<anonymous> (cluster.js:695:8) index-0 (err): at process.emit (events.js:129:20) index-0 (err): at handleMessage (child_process.js:327:10) index-0 (err): at Pipe.channel.onread (child_process.js:355:11) index-0 (err): Error: bind EADDRINUSE index-0 (err): at exports._errnoException (util.js:746:11) index-0 (err): at cb (net.js:1207:33) index-0 (err): at rr (cluster.js:595:14) index-0 (err): at Worker.<anonymous> (cluster.js:566:9) index-0 (err): at process.<anonymous> (cluster.js:695:8) index-0 (err): at process.emit (events.js:129:20) index-0 (err): at handleMessage (child_process.js:327:10) index-0 (err): at Pipe.channel.onread (child_process.js:355:11) |
5
DoraJDJ 2016-07-04 02:20:47 +08:00 via Android
|
7
Mirana 2016-07-04 03:01:49 +08:00
你的端口已经被占用了,换个新的试试
|
8
wico77 OP @Mirana netstat -nltp | grep 8100 返回是 0 然后我用 pm2 start app.js -i 4 就出现错误。但是如果只是 pm2 start app.js 就正常的。
|
9
Mirana 2016-07-04 03:59:34 +08:00 via iPhone
子进程的端口被占用了
|
10
wico77 OP @Mirana pm2 以 cluster 的模式如何多进程呀。子进程还要增加端口吗。不是像 supervisor 一样增加 worker 吗
|
11
ThreeBody 2016-07-04 08:31:05 +08:00 via Android
我刚才测试了一下, cluster 是用同一个端口的,而且以前我写的一个程序也用是这样运行不会出现端口冲突的。
所以应该不是因为进程端口的问题,我的几个建议 1 、你检查一下会不会是硬盘空间满了导致的,刚才搜了一下,有个人因为 pm2.log 太大( 30G ),塞满了硬盘空间导致出现跟你一样的问题。 2 、在其他环境运行一下看看有没有问题。 3 、备份并清空~/.pm2/pm2.log 文件,然后再运行,看看有没有更完整的信息 |
12
ThreeBody 2016-07-04 08:56:52 +08:00 via Android
刚才我又测试了一下,确实如果端口被占用了是会有这个错误的
而且错误会一直刷日志 如果修正错误后,用 pm2 logs 会显示上一次的错误日志 你看看你是不是真的没启动到 或者用 pm2 flush 清理一下日志再试试吧 还有就是,会不会是你的代码写得比较特殊会自己创建端口什么的? |
13
ThreeBody 2016-07-04 11:43:17 +08:00 via Android
突然又想到一个问题,会不会是进程以 fork 模式启动了,启动后 pm2 list 看看
|
14
marvinwilliam 2016-07-04 13:28:17 +08:00
貌似是需要多 CPU,你有几个 CPU, cluster mode 开启之后就会给你加几个负载进程
|
15
marvinwilliam 2016-07-04 13:29:46 +08:00
另外你仔细看官方文档介绍 cluster mode 的地方,第一段就说了和 CPU 数量有关.
|
16
wico77 OP @ThreeBody 代码很简单
var stream = require("stream"), request = require("request"), express = require("express"); var utils = require('utility'); var app = express(); app.get('/watch', function (req, res) { var url = req.query.v; console.log(url); var dd = utils.base64decode(url); request(dd).pipe(res); }); var server = app.listen(8100, function () { var host = server.address().address; var port = server.address().port; console.log("Running on %s:%s", host, port); }); server.listen(8100); 我用 pm2 flush 了也不行。如果已经有以 fork 形式启动后再以 cluster 启动,结果就是之前启动的也会挂掉。我升级到 2 个 CPU 了,也不行。看来跟 CPU 没关系。 |
17
shyling 2016-07-04 15:05:24 +08:00
先把所有 node 进程都结束了再启动吧
|
18
wico77 OP 暂时以 fork 模式多进程吧。 cluster 暂时搞不定
|
19
ThreeBody 2016-07-04 15:50:56 +08:00 via Android
你为何要 listen 两次……
|