树莓派Shell脚本中如何为mailSend命令设置冷却时间?
为树莓派Shell脚本的邮件发送功能添加冷却机制
兄弟,太懂你被重复邮件轰炸的糟心了!咱们给mailSend加个冷却机制就行,核心思路就是记录上一次发送邮件的时间戳,每次触发邮件发送前先检查距离上次发送是不是已经过了你设定的冷却时长(比如1小时),没到就跳过发送,完美解决每分钟发一封的问题~
具体实现方案
我们用一个临时文件来存储上一次发送邮件的时间戳,每次脚本运行时按以下逻辑判断:
- 读取时间戳文件(文件不存在就默认设为0)
- 计算当前时间和上次发送时间的差值
- 如果差值≥设定的冷却时间,就执行
mailSend并更新时间戳;否则直接跳过
修改后的完整代码
# 定义冷却时间,单位:秒(这里设为1小时=3600秒,可按需调整) COOLDOWN_SECONDS=3600 # 存储上次发送时间戳的文件路径,可自定义位置 LAST_SENT_FILE="/tmp/last_temp_email_timestamp" # 获取当前时间的时间戳(秒级) current_time=$(date +%s) # 读取上次发送的时间戳,文件不存在则初始化为0 if [ -f "$LAST_SENT_FILE" ]; then last_sent_time=$(cat "$LAST_SENT_FILE") else last_sent_time=0 fi # 计算当前时间与上次发送时间的差值 time_diff=$((current_time - last_sent_time)) if [ $tempC -ge 40 ]; then # 你的日志记录代码 # 检查冷却时间是否已过 if [ $time_diff -ge $COOLDOWN_SECONDS ]; then mailSend "WARNING: Temperature is currently: $temp and Humidity is: ${file#"sensor_dhtH"}" # 更新时间戳文件 echo "$current_time" > "$LAST_SENT_FILE" fi elif [ $tempC -ge 30 ]; then # 你的日志记录代码 # 检查冷却时间是否已过 if [ $time_diff -ge $COOLDOWN_SECONDS ]; then mailSend "Attention: Temperature is currently: $temp and Humidity is: ${file#"sensor_dhtH"}" # 更新时间戳文件 echo "$current_time" > "$LAST_SENT_FILE" fi else # 你的日志记录代码 fi
额外优化建议
- 如果你想给不同温度阈值设置不同冷却时间(比如警告级邮件1小时发一次,注意级邮件2小时发一次),可以给每个级别单独创建时间戳文件,比如
/tmp/last_warn_email和/tmp/last_attention_email,分开判断即可 /tmp目录下的文件会在树莓派重启后被清空,重启后如果温度仍超标会立刻发送第一封邮件,这个逻辑其实很合理;如果想重启后保留历史时间戳,可以把文件路径改到非临时目录,比如/home/pi/last_email_timestamp
内容的提问来源于stack exchange,提问作者Obama




