Node.js进程持续重启无法访问,kill命令无效求助
排查Node.js进程自动重启+无法访问问题的分步建议
老兄,你遇到的这个问题确实有点棘手——进程杀不死还自动重启,流量明明到了服务器但应用就是没响应,咱们一步步来拆解排查方向:
1. 先搞清楚谁在“复活”你的Node进程
kill -9都干不掉,PID还一直在变,百分百是有个守护进程/进程管理工具在盯着它,一死就自动重启。你可以这么查:
- 跑个
ps auxf看看进程树,找到Node进程的父进程——父进程大概率就是管理它的家伙(比如PM2、systemd、supervisor,甚至是个自定义的shell脚本) - 检查systemd服务:敲
systemctl list-units | grep node,看看有没有和你的Node应用相关的systemd服务在运行;再用systemctl list-unit-files | grep node确认是不是开机自启的 - 看看定时任务:
crontab -l查个人的cron,再去/etc/crontab、/etc/cron.d/目录看看系统级的定时脚本,有没有定时重启的逻辑 - 翻一下
/etc/init.d/目录,有没有和你的应用相关的启动脚本
2. 搞明白为啥流量到了却没响应
tcpdump显示流量到了,netstat也说端口在监听,但页面打不开,可能是这几个原因:
- 你的Node应用根本没完全启动起来,一直在“启动→崩溃→重启”的循环里,端口只是它启动时短暂监听了一下,实际没能力处理请求
- 防火墙/iptables拦了响应包:跑
iptables -L -n看看有没有DROP或者REJECT规则,尤其是OUTPUT链——有时候请求能进来,但响应发不出去 - 应用监听的地址不对:确认你的Node应用是监听
0.0.0.0(允许所有IP访问),而不是127.0.0.1(只能本地访问)。用ss -tulpn | grep node就能看到监听的IP和端口,要是显示127.0.0.1:你的端口,那外部请求肯定没反应
3. 先彻底停掉所有管理进程,手动启动看情况
先把那些自动重启的“幕后黑手”停掉,再手动启动应用,看能不能正常跑:
- 如果是PM2在管:先
pm2 stop all再pm2 delete all,然后ps aux | grep node确认没残留,之后直接在终端敲node app.js启动应用——别后台运行,就直接在终端看,有没有报错输出 - 如果是systemd服务:
systemctl stop 你的服务名,再systemctl disable 你的服务名防止开机自启,然后手动启动应用 - 手动启动的时候,所有报错都会直接打在终端里,这比后台运行容易抓问题——很多时候后台的日志被重定向到你没注意的地方了
4. 挖一挖那些隐藏的日志
你说没找到错误日志,试试这些地方:
- 要是用systemd:
journalctl -u 你的服务名 -f能实时看服务的日志,里面大概率有崩溃原因 - PM2的日志默认在
~/.pm2/logs/目录,每个应用对应out.log和error.log,去翻一翻 - 看看你的应用启动脚本,有没有把日志重定向到别的地方,比如
node app.js > /var/log/myapp.log 2>&1这种,去对应的路径找 - 系统日志也别放过:
/var/log/messages或/var/log/syslog(不同系统可能不一样),搜一下Out of memory或者node相关的条目,可能有进程被杀死的记录
5. 排查系统资源是不是不够了
进程不断重启也可能是资源耗尽导致的:
- 查内存:
free -h看看是不是内存满了,要是OOM Killer(内存不足时系统自动杀进程的机制)杀了Node,那dmesg或者系统日志里会有Out of memory的记录 - 查磁盘:
df -h看看磁盘是不是满了,磁盘满了的话,应用可能写不了日志、存不了临时文件,直接就崩溃重启了
6. 确认端口监听的真实性
有时候netstat显示的监听可能是残留的套接字(比如TIME_WAIT状态),或者是别的进程在监听?用ss -tulpn | grep 你的端口,这个命令能准确显示监听端口的进程PID和名称,确认是不是你的Node进程在监听(不过你的情况PID在变,可能每次重启后短暂监听一下就挂了)
内容的提问来源于stack exchange,提问作者Shawn Taylor
相关产品推荐
相关产品推荐

