世界上最伟大的投资就是投资自己的教育

全场限时 5 折

首页JavaScript
Chalin · 凡人

记一次坑爹的 Node 服务无法启动—Node Server's Aborted

Chalin发布于2706 次阅读

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

  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
└── n@2.1.4 

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: 至于进程耗费内存资源,追踪的问题等过两天,再仔细研究下吧,哎!

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢
统计信息
    学员: 29064
    视频数量: 1973
    文章数量: 489

© 汕尾市求知科技有限公司 | Rails365 Gitlab | Qiuzhi99 Gitlab | 知乎 | b 站 | 搜索

粤公网安备 44152102000088号粤公网安备 44152102000088号 | 粤ICP备19038915号

Top