如何让Node进程遇到特定日志响应时实现自动重启?
解决Forever监控特定非致命错误自动重启Node脚本的问题
嘿,这个问题我之前也碰到过——forever只盯着进程崩溃,那种"进程没死但彻底罢工"的错误确实头疼。给你两个实用的解决方案,看你更倾向哪种:
方案1:在Node脚本内部主动触发重启(推荐)
既然你能精准识别出那个"服务器超时导致的凭证错误",最直接的方式就是在脚本里捕获到这个特定错误时,主动让进程退出。因为forever默认会在进程非0状态退出时自动重启它(如果需要更精准控制,可以加启动参数调整)。
具体操作:
- 找到你处理这个凭证错误的代码位置(比如catch块、错误回调里)
- 加入判断逻辑,一旦匹配到目标错误,就用
process.exit(1)退出进程 - 可选:给forever加启动参数,避免短时间内无限重启:
forever start --minUptime 1000 --spinSleepTime 5000 your-script.js(意思是进程至少运行1秒才会被视为稳定,重启间隔5秒)
示例代码片段:
// 假设你是在异步操作的catch中处理错误 async function handleMessage() { try { // 你的消息处理逻辑,比如调用接口获取凭证 const credentials = await fetchCredentials(); // ...后续逻辑 } catch (error) { // 精准匹配你的错误信息,比如根据错误消息或错误码 if (error.message.includes("服务器超时引发的凭证错误") || error.code === "CRED_TIMEOUT") { console.error("[致命错误] 凭证失效,将退出进程触发重启"); // 非0状态退出,让forever重启 process.exit(1); } else { // 其他非致命错误,仅记录日志不退出 console.error("[非致命错误] 处理失败:", error); } } }
方案2:用外部脚本监控日志触发重启
如果你不想修改Node脚本的代码,可以写一个简单的监控脚本,实时盯着forever生成的错误日志,一旦出现目标错误关键词,就调用forever restart命令重启进程。
步骤:
先确保forever把错误日志输出到指定文件,启动时指定日志路径:
forever start -l forever.log -o out.log -e err.log your-script.js这里
err.log就是我们要监控的错误日志文件。写一个bash监控脚本(保存为
monitor-restart.sh):#!/bin/bash # 替换成你的错误日志绝对路径 LOG_FILE="/absolute/path/to/err.log" # 替换成你日志里的具体错误关键词 TARGET_ERROR="服务器超时引发的凭证错误" # 替换成你的脚本名称(forever能识别的进程标识) SCRIPT_NAME="your-script.js" # 实时监控日志文件的新增内容 tail -fn0 "$LOG_FILE" | while read -r line; do if echo "$line" | grep -q "$TARGET_ERROR"; then echo "[$(date)] 检测到目标错误,重启进程..." # 重启指定进程 forever restart "$SCRIPT_NAME" # 可选:清空错误日志,避免重复触发(如果错误会重复打印的话) # echo "" > "$LOG_FILE" fi done给脚本加执行权限,然后后台运行:
chmod +x monitor-restart.sh nohup ./monitor-restart.sh &
这个方案的好处是不用动应用代码,但缺点是依赖日志输出的准确性,如果日志格式变了可能会失效。
额外建议:考虑换成PM2
如果以后有机会,不妨试试PM2——它比forever功能更丰富,内置了日志管理、自定义重启规则,甚至可以通过配置文件直接指定"日志出现特定关键词时重启",不用自己写监控脚本。而且PM2的进程监控更稳定,还支持负载均衡、日志轮转等实用功能。
内容的提问来源于stack exchange,提问作者WildGunman
相关产品推荐
相关产品推荐

