坑爹的Node启动问题——Aborted

晚上下班后,离职的前端同事在微信群说,公司网站无法访问了,我一试果然不行。立马火急火燎登录服务器查找原因。

  1. 查看进程

首先我查了下服务器的进程,如下:

1
2
root@server:# ps -ef | grep node
root 27947 27930 0 10:50 pts/1 00:00:00 grep --color=auto node

我发现糟糕了,node进程已经被终止了!这可就有点莫名其妙了,我怀疑是不是备份出了问题,导致项目不存在了,于是赶紧切到项目目录下,发现文件完整无误:

1
2
3
root@server:~/webend# ls
README.md bin controllers err.log lib node_modules package.json pm2Restart.sh pm2Stop.sh robots.txt upload
app.js config dump.rdb foreverScripts models out.log pm2.log pm2Start.sh public routes views

我想到前两天阿里云服务器到期,忘记续费,被强制停机了,后来后台启动服务时,我使用 pm2 替换了之前的 forever(forever是上位同事用的,而我更喜欢pm2)。那我就列一下应用列表,查看下详情吧:

1
2
3
4
root@server:~/webend# pm2 list
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
├──────────┼────┼──────┼──────┼─────────┼─────────┼────────┼─────┼────────┼──────────┤
│ abc │ 0 │ fork │ 3038 │ stopped │ 2 │ 0 │ 0% │ 0 B │ disabled │

注意看,status状态为stopped,说明当前服务确实没有运行。既然如此,那我就重启服务吧。

  1. 重启服务

pm2重启服务,之前为了方便写了个重启脚本:

1
2
3
4
5
6
7
root@server:~/webend# ./pm2Restart.sh
[PM2] Applying action restartProcessId on app [app.js](ids: 0)
[PM2][ERROR] Process 0 not found
┌──────────┬────┬──────┬──────┬─────────┬─────────┬────────┬─────┬────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
├──────────┼────┼──────┼──────┼─────────┼─────────┼────────┼─────┼────────┼──────────┤
│ abc │ 0 │ fork │ 3038 │ stopped │ 3 │ 0 │ 0% │ 0 B │ disabled

竟然有个ERROR,说进程0未找到,我猜想是否因为脚本有问题呢,然后就手动停止服务,再重新启动:

1
2
3
4
5
6
7
8
root@server:~/webend# pm2 stop abc
[PM2] Applying action stopProcessId on app [abc](ids: 0)
[PM2] [abc](0) ✓
root@server:~/webend# pm2 start -n abc -al pm2.log -ao out.log -ae err.log app.js
┌──────────┬────┬──────┬──────┬─────────┬─────────┬────────┬─────┬────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
├──────────┼────┼──────┼──────┼─────────┼─────────┼────────┼─────┼────────┼──────────┤
│ abc │ 0 │ fork │ 3038 │ stopped │ 0 │ 0 │ 0% │ 0 B │ disabled

发现仍然无法启动,这就糟糕了,不禁有点紧张,这可是在生产服务器啊!我好方!!!

  1. 排查原因

我想难道是pm2出了问题?导致无法启动服务吗,但是挺成熟的模块按理不应该啊。那么我就一步步来找原因吧。

  • 单独启动服务
1
2
root@server:~/webend# node app.js 
Aborted

握草,这是尼玛什么情况啊?百度了下“Aborted”表示流产,那我也没让她给我生孩子啊,流产个毛线。从来没遇到这种情况的说,错误日志也没有,一脸懵逼啊,又试了3遍,依然这样,已经有点冷汗往外冒了。不知如何是好了!

  • 备份目录启动

我想到好像之前有做备份,然后去备份目录查看,发现是按周整目录备份的。最近一周好像也没有提交代码,如果备份可以启动,那就用这个也没有问题的了。

1
2
3
root@server:~/webend# cd ../backup
root@server:~/backup-20170216# node app.js
Aborted

这下子可真是十脸懵逼了,备份都没法启动,郁闷无比啊。

  • 新建项目

我冷静下来仔细想想,看是否还有其它问题。暂时没想到,于是我新建了个目录,搭了个简易环境,启动最简单的node服务,事实结果跟上面一模一样,不变的“Aborted”,真是想fuck了!

1
2
root@server:/home/newApp# node app.js
Aborted

  • Node升级

实在了无头绪,于是我想是否node本身出了问题呢?于是查看官方网站,最新的LTS版本,发现是6.9.5,比我目前高,然后我就升级最新版node,需要提前安装n模块,如下:

1
2
3
4
5
6
7
8
9
root@server:/# node -v
v6.9.1
root@server:/# npm install -g n
/usr/local/node/bin/n -> /usr/local/node/lib/node_modules/n/bin/n
/usr/local/node/lib
└── n@2.1.4

root@server:/# n v6.9.5
################################# 46.8%

可能是国外镜像,安装过程实在是慢如蜗牛,我还要下班撩妹呢,实在是等不及了,更何况还不一定是这个问题呢!

  1. 定位问题
  • Redis服务

万般无奈,我只好查找其他原因了,跟node服务相关联的还有个Redis服务,用来做用户session缓存,难道是redis服务出了问题吗?从而影响到的node,然后我查了进程,发现真的进程不存在了:

1
2
root@server:/# ps -ef|grep redis
root 27947 27930 0 10:50 pts/1 00:00:00 grep --color=auto redis

redis我可是改的redis.conf里面的daemonize参数为yes,然后后台启动的,理论上不会出问题的。

1
2
3
4
5
6
7
8
root@server:/etc/redis# cat redis.conf
################################ GENERAL #####################################

# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes

root@server:/etc/redis# redis-server redis.conf

这是如此的令我感到惊奇,但是并不能解决问题。

  • RabbitMQ服务

我想起服务器上部署了一套RabbitMQ环境,看看是否在运行,结果打开页面用web插件访问,提示失败,然后查进程,果然不存在。

1
2
root@server:/# ps -ef|grep rabbit
root 27947 27930 0 10:50 pts/1 00:00:00 grep --color=auto rabbit

走到这里,我不禁诧异了,所有的服务进程全部被终止,似乎触摸到了问题原因所在,查看所有进程,发现很多进程依然存在,但是大多都是系统级进程。

我灵感一现,抓到了一丝,使用htop查看资源内存cpu的使用率,终于恍然大悟,算是拨开了云雾,如下:

1
2
3
4
5
6
7
8
9
10
11
root@server:/# htop
1 [| 0.7%] Tasks: 70, 105 thr; 1 running
2 [|| 2.6%] Load average: 0.01 0.04 0.04
Mem[||||||||||||||||||||||||||||||||||||||||||||||||||||| 3844/3951MB] Uptime: 00:08:21
Swp[ 0/0MB]

PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1433 root 20 0 26124 2380 1360 R 2.0 0.1 0:03.10 htop
1270 root 20 0 2620M 53080 3152 S 0.7 1.3 0:04.83 /home/erlang/lib/erlang/erts-8.0/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /ho
851 nobody 20 0 286M 23840 888 S 0.7 0.6 0:00.30 /usr/sbin/varnishd -P /var/run/varnishd.pid -a :6081 -T localhost:6082 -f /etc/varnish/
993 root 20 0 78620 8644 5016 S 0.0 0.2 0:01.44 /usr/local/aegis/alihids/AliHids

沃他妈的™的内存使用率高达98%,其他进程还能启动吗?!!!

  1. 解决问题

既然找到了问题,解决就不难办了,不过也没时间去追踪哪个进程耗费了如此多的内存,先把服务启动了再说吧。最简单莫过于重启服务器了:

1
root@server:/# reboot

重启之后,再依次启动redis服务,rabbitMQ服务,最后pm2启动node服务,一切都完美解决,网站可以正常访问了!

  1. 后记

真是一次郁闷又坑爹的问题啊,费了我好久,差点都怀疑自己了,不过最终还是解决了问题,算是总结经验吧。

PS: 至于进程耗费内存资源,追踪的问题等过两天,再仔细研究下吧,哎!