记一次坑爹的Node服务无法启动—Node Server's Aborted
发布于 2 年前 作者 Chalin-Shi 4199 次浏览 来自 分享

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

  1. 查看进程

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

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

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

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)。那我就列一下应用列表,查看下详情吧:

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重启服务,之前为了方便写了个重启脚本:

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未找到,我猜想是否因为脚本有问题呢,然后就手动停止服务,再重新启动:

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出了问题?导致无法启动服务吗,但是挺成熟的模块按理不应该啊。那么我就一步步来找原因吧。

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

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

  • 备份目录启动

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

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

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

  • 新建项目

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

root@server:/home/newApp# node app.js
Aborted
  • Node升级

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

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
└── [email protected] 

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

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

  1. 定位问题
  • Redis服务

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

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,然后后台启动的,理论上不会出问题的。

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插件访问,提示失败,然后查进程,果然不存在。

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

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

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

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. 解决问题

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

root@server:/# reboot

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

  1. 后记

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

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

3 回复

哈哈,我裤子都脱了,还准备学东西呢,你就告诉我重启大法搞定了?(黑人问号脸) Ps:多嘴说一句,耗费资源的进程都没找到,重启你放心吗?

@haozxuan 哈哈哈,当时没来得及看是哪个进程的问题。准备重现了再查。裤子都脱了,可以先撸一管。

好蛋疼,我还准备学东西呢…

回到顶部