Bash脚本循环执行Node脚本时意外终止问题求助
解决Bash周期性执行Node脚本提前终止的问题
你写的脚本计划每10秒执行一次Node脚本、持续7小时(共2520次循环),但实际30分钟左右就停止了,下面是具体排查和解决方法:
1. 先捕获Node脚本的错误输出
你的脚本只记录了Node的标准输出,错误信息没写入日志,很可能是Node脚本抛出未捕获的异常,间接导致流程中断。修改Node命令行,把错误输出也定向到日志:
/Users/xxx/.nvm/versions/node/v18.0.0/bin/node --no-warnings /Users/xxx/code/xxx/src/xxx/xxx.js >> /Users/xxx/logs/log.log 2>&1
同时可以在循环里记录Node的退出码,方便定位问题:
# 执行Node脚本并捕获退出码 /Users/xxx/.nvm/versions/node/v18.0.0/bin/node --no-warnings /Users/xxx/code/xxx/src/xxx/xxx.js >> /Users/xxx/logs/log.log 2>&1 node_exit_code=$? # 将退出码写入日志 echo "循环次数: $i | Node退出码: $node_exit_code | 当前时间: $now" >> /Users/xxx/logs/log.log
2. 避免终端关闭终止脚本
如果是在终端直接运行这个Bash脚本,关闭终端会发送SIGHUP信号终止进程。用nohup后台启动脚本就能解决:
nohup bash your_script_name.sh &
默认输出会写到当前目录的nohup.out,也可以指定输出文件:
nohup bash your_script_name.sh >> /Users/xxx/logs/script_run.log 2>&1 &
3. 验证循环计数与运行时长
原脚本的循环次数计算是正确的(6*60*7=2520次,对应7小时),但可以修改echo语句,把已运行时长也打印出来,确认是不是真的到30分钟就停止了:
echo "循环次数: $i | 总次数: $t | 已运行时长: $((i*10))秒 | 当前时间: $now" >> /Users/xxx/logs/log.log
这样能直观看到每次循环的累计运行时间,判断是循环提前结束还是脚本被外部信号终止。
4. 检查日志文件权限与磁盘空间
如果日志文件所在目录没有写入权限,或者磁盘已满,>>重定向会失败,可能导致脚本终止。提前验证:
touch /Users/xxx/logs/log.log && echo "测试写入成功" >> /Users/xxx/logs/log.log
如果这步报错,先修复权限或清理磁盘空间。
5. 改用更可靠的定时方案
Bash循环+sleep的方式适合短周期临时任务,长期定时推荐用cron,稳定性更高:
用cron实现每10秒执行一次
cron最小粒度是分钟,所以写一个每分钟执行6次的脚本:
#!/bin/bash # 每分钟执行6次,每次间隔10秒 for ((count=0; count<6; count++)); do /Users/xxx/.nvm/versions/node/v18.0.0/bin/node --no-warnings /Users/xxx/code/xxx/src/xxx/xxx.js >> /Users/xxx/logs/log.log 2>&1 sleep 10 done
然后编辑crontab(执行crontab -e),添加定时任务,设置运行7小时的时间范围(比如每天9点到16点):
* * * * 9-15 * /path/to/your_minute_script.sh
内容的提问来源于stack exchange,提问作者mbarish-me
相关产品推荐
相关产品推荐

