You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:04:56