用shell写个简单的log监控程序

本文介绍如何编写一个简单的Shell脚本来监控Apache的error_log和MySQL的slow_query_log,当发现新的错误或慢查询时,通过邮件发送警报。脚本通过比较日志文件的旧备份和当前版本来检测变化,并使用diff和mail命令发送通知。

检查apache的error log和mysql slow query log,可以及时的发现问题。但在开发和运营的过程中,如果没有意识到有错误发生,我们往往不会主动的查看log的习惯,而且每天查看log也不现实。

 

但是不明显的错误不表示没有错误,潜在的问题往往是最严重的问题。因此写个log监控程序很有必要。

 

#!/bin/sh

ADDRESS='email1@domain.com email2@domain.com'


APACHE_ERROR_LOG='/usr/local/apache/logs/error_log'

 

if [ `/usr/bin/wc -c < ${APACHE_ERROR_LOG}` -ne `/usr/bin/wc -c < ${APACHE_ERROR_LOG}.old` ];
then
  diff ${APACHE_ERROR_LOG}.old ${APACHE_ERROR_LOG} | mail -s '194 apache error log' ${ADDRESS}
fi

 

rm -f ${APACHE_ERROR_LOG}.old
cp ${APACHE_ERROR_LOG} ${APACHE_ERROR_LOG}.old
chmod 666 ${APACHE_ERROR_LOG}.old

 

MYSQL_SLOW_LOG='/log/mysql-slow-query'

if [ `/usr/bin/wc -c < ${MYSQL_SLOW_LOG}` -ne `/usr/bin/wc -c < ${MYSQL_SLOW_LOG}.old` ];
then
  diff ${MYSQL_SLOW_LOG}.old ${MYSQL_SLOW_LOG} | mail -s '194 mysql slow log' ${ADDRESS}
fi

 

rm -f ${MYSQL_SLOW_LOG}.old
cp ${MYSQL_SLOW_LOG} ${MYSQL_SLOW_LOG}.old
chmod 666 ${MYSQL_SLOW_LOG}.old

 

将以上代码保存为:notify_error.sh,在apache和mysql的log目录下分别建立原文件的备份error_log.old和mysql-slow-query.old文件(用于文件比对)

 

设定监控程序为守护进行,比如上班时间每小时执行一次:

 

cd /var/spool/cron/
之后运行crontab -e

键入如下内容,保存
30 8-18 * * * /home/sh/notify_error.sh

 

ok。以后每当apache 有error 发生,或者mysql有slow query发生,就可以及时收到邮件提醒了。

 

<think>我们正在编一个用于OTA升级的Shell脚本。根据之前的引用,特别是引用[3]中提到的安装脚本示例,我们可以构建一个基本的OTA升级流程。这个流程通常包括以下步骤: 1. 下载升级包(通常是一个压缩文件) 2. 验证升级包的完整性(例如,使用校验和或数字签名) 3. 解压升级包 4. 执升级(复制文件、执安装脚本等) 5. 清理临时文件 6. 重启设备(如果需要) 但是,由于我们是在资源受限的嵌入式设备(如STM32L496)上运,我们需要考虑: - 存储空间:升级包可能较大,需要确保有足够的空间存放临时文件。 - 可靠性:升级过程能损坏当前系统,需要确保能够回滚或者在失败时恢复。 - 安全性:升级包必须经过验证,防止恶意软件。 根据引用[3],我们可以采用一种自解压脚本的形式。该脚本将升级包附加在脚本末尾,然后脚本运时将自身末尾的升级包解压出来并执安装。 因此,我们设计一个自解压的OTA升级脚本,结构如下: 1. 脚本开头是Shell脚本代码,用于处理升级。 2. 脚本末尾附加一个压缩的升级包(例如tar.bz2格式)。 当运脚本时,脚本会读取自身(从特定开始)的内容,将其解压,然后执升级。 参考引用[3]的示例,我们可以这样: 假设我们的脚本名为`ota_upgrade.sh`,它包含: - 前N是脚本代码(安装逻辑) - 从第N+1开始是压缩的升级包(二进制数据) 升级步骤: 1. 计算脚本自身的数(即安装脚本的数),然后使用`tail`命令跳过这些,将后面的数据重定向到一个临时文件(即升级包)。 2. 解压这个临时文件。 3. 执升级(例如,将解压后的文件复制到目标位置)。 4. 清理临时文件。 但是,为了安全性和可靠性,我们还需要增加: - 对升级包的校验(例如,使用md5sum或sha256sum) - 升级前检查磁盘空间 - 升级失败时的回滚机制(可选,但很重要) 考虑到嵌入式设备的限制,我们可能没有很多工具可用,因此尽量使用标准的工具(如busybox提供的工具)。 下面我们开始编一个基础的OTA升级脚本。 注意:由于升级包是附加在脚本后面的,所以生成脚本时需要将安装脚本和升级包合并成一个文件。 步骤: 1. 编安装脚本(即下面的代码部分),假设我们将其保存为`install_script.sh`。 2. 将升级包(例如`update.tar.bz2`)附加到`install_script.sh`的末尾,生成最终的OTA升级脚本`ota_upgrade.sh`。 在设备上运`ota_upgrade.sh`即可。 下面是一个示例脚本(安装部分): </think>### Shell脚本编OTA升级程序的方法 以下是一个完整的OTA升级Shell脚本实现方案,结合了嵌入式设备特性和安全升级流程: ```bash #!/bin/bash # OTA升级脚本 v1.2 (适用于STM32L496) OTA_SERVER="http://firmware.example.com/update" TEMP_DIR="/tmp/ota_update" LOG_FILE="/var/log/ota.log" BACKUP_DIR="/backup" CHECKSUM_ALGO="sha256sum" # 初始化环境 init_environment() { mkdir -p $TEMP_DIR $BACKUP_DIR echo "[$(date)] OTA升级启动" > $LOG_FILE } # 下载固件包 download_firmware() { local firmware_url="$OTA_SERVER/firmware-v$1.tar.bz2" local checksum_url="$OTA_SERVER/checksum-v$1.sha256" echo "下载固件包: $firmware_url" | tee -a $LOG_FILE wget -q -P $TEMP_DIR $firmware_url || { echo "下载失败 [错误代码:$?]" | tee -a $LOG_FILE return 1 } echo "下载校验文件" | tee -a $LOG_FILE wget -q -P $TEMP_DIR $checksum_url || return 2 } # 验证完整性 verify_integrity() { local firmware_file="$TEMP_DIR/$(ls $TEMP_DIR | grep tar.bz2)" local checksum_file="$TEMP_DIR/$(ls $TEMP_DIR | grep sha256)" echo "验证固件完整性..." | tee -a $LOG_FILE $CHECKSUM_ALGO -c $checksum_file 2>> $LOG_FILE || { echo "校验失败: 文件可能被篡改" | tee -a $LOG_FILE return 1 } return 0 } # 执升级 perform_upgrade() { echo "开始固件更新..." | tee -a $LOG_FILE # 备份当前系统 tar -jcf $BACKUP_DIR/backup-$(date +%Y%m%d).tar.bz2 /bin /lib /etc 2>> $LOG_FILE # 解压新固件 local firmware_file="$TEMP_DIR/$(ls $TEMP_DIR | grep tar.bz2)" tar -jxvf $firmware_file -C / 2>&1 | tee -a $LOG_FILE # 执安装后脚本 if [ -f /post_install.sh ]; then echo "执安装后脚本" | tee -a $LOG_FILE chmod +x /post_install.sh /post_install.sh 2>&1 | tee -a $LOG_FILE fi } # 主升级流程 main() { version=$1 [ -z "$version" ] && { echo "用法: $0 <版本号>" exit 1 } init_environment download_firmware $version || exit 2 verify_integrity || exit 3 # 用户确认 read -p "确认升级到v$version? (y/n) " confirm [ "$confirm" != "y" ] && exit 0 perform_upgrade echo "升级完成! 建议重启设备" | tee -a $LOG_FILE rm -rf $TEMP_DIR } main "$@" ``` #### 关键组件说明 1. **固件包结构** ``` firmware-v2.1.tar.bz2 ├── bin/ # 可执文件目录 ├── lib/ # 库文件目录 ├── etc/ # 配置文件目录 └── post_install.sh # 安装后脚本[^3] ``` 2. **安全验证机制** - 使用$CHECKSUM_ALGO进完整性校验[^1] - 升级前自动备份系统(存储在$BACKUP_DIR) - 支持数字签名验证(可扩展) 3. **升级流程** ```mermaid graph TD A[启动升级] --> B[下载固件] B --> C[验证完整性] C --> D{验证通过?} D -->|是| E[用户确认] D -->|否| F[终止升级] E -->|确认| G[备份系统] G --> H[解压固件] H --> I[执安装脚本] I --> J[清理临时文件] ``` #### 使用示例 ```bash # 升级到v2.1版本 $ ./ota_upgrade.sh 2.1 下载固件包: http://firmware.example.com/update/firmware-v2.1.tar.bz2 下载校验文件 验证固件完整性... firmware-v2.1.tar.bz2: OK 确认升级到v2.1? (y/n) y 开始固件更新... 创建备份: /backup/backup-20230815.tar.bz2 解压文件中... 执安装后脚本... 升级完成! 建议重启设备 ``` #### 增强功能建议 1. **断点续传**:使用`wget -c`支持下载中断后继续 2. **版本回滚**:添加`--rollback`参数恢复备份 3. **安全扩展**:集成GPG签名验证[^2] 4. **资源监控**:添加磁盘空间和内存检查 ```bash check_resources() { local free_space=$(df -k / | awk 'NR==2 {print $4}') [ $free_space -lt 51200 ] && { echo "错误: 磁盘空间(需要50MB)" | tee -a $LOG_FILE return 1 } return 0 } ``` > **关键提示**:在嵌入式设备部署时,需确保BusyBox包含`wget, tar, sha256sum`等必要工具[^1][^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值