Ⅰ、明确需求
首先在编写shell脚本之前需要先明确需求,就是你需要这个脚本能为你做什么,达到什么效果,然后按需求进行shell脚本编写。因为实际工作环境中,一些配置因各种原因无法在代码里实现,或是改动代码不方便,这就需要shell脚本来辅助达到所需效果了。
本次我的需求是解决rocketmq客户端日志清理问题,想要的效果就是定时的检查/root/logs/rocketmqlogs下的rocketmq_client.log日志,用过rocketmq的都知道这个日志的输出规则。就是日志滚动策略,当该日志达到1GB的时候会打个包留存,最多保存10个包,也就是10GB。
我想要的效果是让该日志滚动策略只保存5个包。设置定时删除/root/logs/roketmqlogs目录下名为rocketmq_client.log.10、rocketmq_client.log.9、rocketmq_client.log.8、rocketmq_client.log.7、rocketmq_client.log.6的文件。要求每隔5小时执行一次这个脚本。并把这个脚本执行的结果输出到/root/logs/roketmqlogs下名为delete_rocketmq_logs.log的文件里。执行结果为:本次执行脚本有没有进行删除操作,有的话删除了哪些东西。
Ⅱ、如何实现需求
# 来到你想处理的日志目录下,创建个定时清理脚本
cd /root/logs//rocketmqlogs
vim delete_rocketmq_logs.sh
# 编写以下内容(#!/bin/bash必须编写进去,意思是说明此文件是脚本文件)
#!/bin/bash
# 设置日志目录路径
logs_dir="/root/logs/roketmqlogs"
# 设置日志文件路径
log_file="/root/logs/roketmqlogs/delete_rocketmq_logs.log"
# 获取当前时间
current_time=$(date "+%Y-%m-%d %H:%M:%S")
# 初始化已删除文件列表为空字符串
deleted_files=""
# 删除指定文件
for i in {6..10}; do
# 构建文件路径
file="$logs_dir/rocketmq_client.log.$i"
# 检查文件是否存在
if [ -f "$file" ]; then
# 删除文件
rm "$file"
# 将已删除文件列表添加到变量中
deleted_files+="rocketmq_client.log.$i "
fi
done
# 输出执行结果到日志文件
echo "[$current_time] Deleted files: $deleted_files" >> "$log_file"
# 给它添加可执行文件权限
chmod +x delete_rocketmq_logs.sh
# 然后,使用命令编辑系统用户的 crontab 文件
crontab -e
# 打开crontab文件后编写以下内容
0 */5 * * * /root/logs/rocketmqlogs/delete_rocketmq_logs.sh >> /root/logs/rocketmqlogs/delete_rocketmq_logs.log 2>&1
# 编写保存之后次脚本就已经是在运行状态了,测试的时候可以改成每分钟执行一次 */1 * * * * 更直观查看效果。
这样,每隔5小时,脚本将检查并删除 /root/logs/roketmqlogs 目录下的指定文件,并将执行结果记录在 /root/logs/roketmqlogs/delete_rocketmq_logs.log 文件中。
当然这个时间都是可控的,这个 0 */5 * * * 叫cron表达式,改成你想要的时间就可以了。
如何编辑文件内容:
像本次输入vim delete_rocketmq_logs.sh命令、crontab -e命令之后,都会进入一个新页面,新页面就是文件的编辑页面。
按“i”键进入编辑状态,然后可以编写内容了;
按“ESC”键退出编辑状态;
同时按“shift”和英文的“:”再输入保存指令“wq”;
按回车退出编辑页面回到原系统页面,就算编辑好了
以下为操作过程:
[root@localhost rocketmqlogs]# cd /root/logs//rocketmqlogs
[root@localhost rocketmqlogs]# vim delete_rocketmq_logs.sh
[root@localhost rocketmqlogs]# chmod +x delete_rocketmq_logs.sh
[root@localhost rocketmqlogs]# crontab -e
Ⅲ、解析语法参数
1、#!/bin/bash:这是脚本文件的 shebang 行,指定该脚本使用 bash 解释器来执行。
2、logs_dir="/root/logs/roketmqlogs":定义 logs_dir 变量并设置为 /root/logs/roketmqlogs 目录的路径。
3、log_file="/root/logs/roketmqlogs/delete_rocketmq_logs.log":定义 log_file 变量并设置为 /root/logs/roketmqlogs/delete_rocketmq_logs.log 文件的路径。
4、current_time=$(date "+%Y-%m-%d %H:%M:%S"):使用 date 命令获取当前时间,并将其格式化为 %Y-%m-%d %H:%M:%S 的字符串格式,保存到 current_time 变量中。
5、deleted_files="":定义 deleted_files 变量并设置为空字符串。
6、for i in {6..10}; do:开始一个 for 循环,循环变量 i 的值从 6 取到 10(包含 6 和 10)。
7、file="$logs_dir/rocketmq_client.log.$i":定义 file 变量并设置为 $logs_dir/rocketmq_client.log.$i 文件的路径。
8、if [ -f "$file" ]; then:如果文件 $file 存在,则执行以下操作。
9、rm "$file":删除文件 $file。
10、deleted_files+="rocketmq_client.log.$i ":将 rocketmq_client.log.$i 添加到 deleted_files 变量中。
11、fi:结束 if 语句。
12、done:结束 for 循环。
13、echo "[$current_time] Deleted files: $deleted_files" >> "$log_file":将当前时间、已删除的文件列表输出到 $log_file 文件中。>> 表示将输出附加到文件的末尾,而不是覆盖文件的内容。
ps:
shell作为计算机脚本语言,也有自己的一套逻辑,以上作为本次解决问题的过程分享,想达到其他各种效果,可通过改写代码或参数的方式实现,万变不离其宗,它没有你想象的那么难。