我们下一阶段将学习python语言,python是目前很流行且相对成熟的语言,程序员社区建设也好,各种库也成熟,如果有群友对这部分很熟悉,可以免学跳过。
再学习python语言前,我们要通过若干大作业来总结前一段的学习任务。
第一个大作业,写一个自动化压缩目录下符合一定规律文件的自动化脚本
任务1:写一个模拟产生日志的脚本
假定你的工作目录是/data/。子工作目录是/data/work1/、/data/work2/ 和/data/work3。你需要写一个脚本,每个小时在以上三个目录中分别创建文件。例如
/data/work1/readme.20200425_09
/data/work1/readme.20200425_10
/data/work1/readme.20200425_11
…
/data/work2/pubme.20200425_09
/data/work2/pubme.20200425_10
/data/work2/pubme.20200425_11
…
/data/work3/iconme.20200425_09
/data/work3/iconme.20200425_10
/data/work3/iconme.20200425_11
…
并在文件内写入生产文件的时间(年月日时分秒)。
我们假定这个程序是线上环境输出的每个小时应用程序产生的日志。且假定这个日志文件非常大(实际生产环境会很大,我们做实验其实很小,但假定这个文件很大需要压缩)。
base_path=/data file_prefixs=(“readme” “pubme” “iconme”)
for i in {1..3}
do
file_folder=”$base_path/work$i”
mkdir -p $file_folder
file_prefix=${file_prefixs[i-1]}file_name="$file_prefix.$(date "+%Y%m%d_%H")"echo $(date "+%Y-%m-%d %H:%M:%S") > "$file_folder/$file_name"
done
2. 添加定时任务```bash[root@localhost data]# crontab -l* */1 * * * /bin/bash /gen.sh[root@localhost data]# systemctl restart cron
base_path=/data
清除所有文件
rm -rf $basepath/* date_time=`date “+%Y%m%d%H”`
./gen.sh
file_prefixs=(“readme” “pubme” “iconme”)
for i in {1..3} do file_folder=”$base_path/work$i”
# 检查是否创建了3个文件。if [ ! -e $file_folder ]thenecho $file_folder not existsfi# 检查文件是否创建文件file_prefix=${file_prefixs[i-1]}file_path="$file_folder/$file_prefix.$date_time"if [ ! -e $file_path ]thenecho $file_path not existsfi
done
<a name="eS948"></a>## 任务2:写一段脚本自动压缩这个目录下每个带有时间特征的文件。功能如下:<br />能够每隔5分钟启动一次,判断/data/目录下所有子目录中是否产生了带有时间特征的文件,且没有压缩,如果有,放过最新的这一个不压缩,把其他的都压缩了。<br />那么假定这个脚本启动看到上面那个例子将会压缩成如下情况<br />/data/work1/readme.20200425_09 <br />/data/work1/readme.20200425_09.7z<br />/data/work1/readme.20200425_10<br />/data/work1/readme.20200425_10.7z<br />/data/work1/readme.20200425_11 (放过最新的这个不压缩)<br />…/data/work2/pubme.20200425_09 <br />/data/work2/pubme.20200425_09.7z<br />/data/work2/pubme.20200425_10<br />/data/work2/pubme.20200425_10.7z<br />/data/work2/pubme.20200425_11 (放过最新的这个不压缩)<br />…/data/work3/iconme.20200425_09 <br />/data/work3/iconme.20200425_09.7z<br />/data/work3/iconme.20200425_10<br />/data/work3/iconme.20200425_10.7z<br />/data/work3/iconme.20200425_11 (放过最新的这个不压缩)<br />…<br />主要:主要脚本代码中不要有硬编码,不要出现work1,work2,work3这种。否则如果以后/data/目录下新增加一个work4,还需要手动修改这个脚本,要做到,无论在这个目录下加入什么子目录,这个脚本可以自动实别子目录下带时间特征的文件进行压缩。1. 编写脚本```bash[root@localhost data]# cat compress.sh#!/bin/bashbase_path=/datacompress() {dir_path=$1for file_name in `ls -l $dir_path | grep ^- | grep -v '7z$' | awk '{print $9}' | sort -r | awk 'NR>1'`dofile_path="$dir_path/$file_name"if [ -e "$file_path.7z" ]thenecho "$file_path.7z exists"continuefiif [ -n "`lsof -c 7z | grep $file_path.7z`" ]thenecho "$file_path is compressing"continuefiecho "$file_path start compressing"7z a $file_path.7z $file_path > /dev/null &done}for file_name in `ls -l $base_path | grep ^d | awk '{print $9}'`dofile_path="$base_path/$file_name"compress $file_pathdone
- 添加定时任务 ```bash [root@localhost data]# crontab -l /5 * /bin/bash /compress.sh
[root@localhost data]# systemctl restart cron
3. 测试```bash[root@localhost data]# cat compress_test.sh#!/bin/bashbase_path=/data# 清空子文件夹for file_name in `ls -l $base_path | grep ^d | awk '{print $9}'`dofile_path="$base_path/$file_name"rm -rf $file_path/*done# 创建一个大文件,延长压缩时间if [ ! -e "$base_path/temp" ]thenecho creating large filefor i in {1..5}dohead -n 1000000 /dev/urandom >> $base_path/tempdonefi# 创建6个文件夹,每个文件夹中添加3个大文件。file_prefixs=("readme" "pubme" "iconme" "readme" "pubme" "iconme")for i in {1..6}dofile_folder="$base_path/work$i"`mkdir -p $file_folder`file_prefix=${file_prefixs[i-1]}for j in {1..3}dofile_name="$file_prefix.$(date -d "-$j hour" "+%Y%m%d_%H")"file_path="$file_folder/$file_name"if [ ! -e $file_path ]thencp -f $base_path/temp $file_pathfidonedone# 多次执行压缩脚本,查看是否会重复压缩。for i in {1..5}do./compress.shsleep 10done
执行脚本后打开另一个终端,查看当前 7z 进程
# 多次查看进程没有发现重复压缩的文件。而且目录 work4 work5 work6 下的文件也都被压缩了。最新的文件 readme.20200504_17 没有被压缩。[root@localhost data]# ps -ef | grep 7zchao 16510 1 33 17:05 ? 00:00:51 /usr/lib/p7zip/7z a /data/work1/readme.20200504_15.7z /data/work1/readme.20200504_15chao 16517 1 32 17:05 ? 00:00:49 /usr/lib/p7zip/7z a /data/work1/readme.20200504_14.7z /data/work1/readme.20200504_14chao 16531 1 31 17:05 ? 00:00:48 /usr/lib/p7zip/7z a /data/work2/pubme.20200504_15.7z /data/work2/pubme.20200504_15chao 16538 1 32 17:05 ? 00:00:49 /usr/lib/p7zip/7z a /data/work2/pubme.20200504_14.7z /data/work2/pubme.20200504_14chao 16552 1 31 17:05 ? 00:00:47 /usr/lib/p7zip/7z a /data/work3/iconme.20200504_15.7z /data/work3/iconme.20200504_15chao 16559 1 31 17:05 ? 00:00:48 /usr/lib/p7zip/7z a /data/work3/iconme.20200504_14.7z /data/work3/iconme.20200504_14chao 16575 1 31 17:05 ? 00:00:47 /usr/lib/p7zip/7z a /data/work4/readme.20200504_15.7z /data/work4/readme.20200504_15chao 16584 1 32 17:05 ? 00:00:49 /usr/lib/p7zip/7z a /data/work4/readme.20200504_14.7z /data/work4/readme.20200504_14chao 16598 1 32 17:05 ? 00:00:48 /usr/lib/p7zip/7z a /data/work5/pubme.20200504_15.7z /data/work5/pubme.20200504_15chao 16605 1 31 17:05 ? 00:00:48 /usr/lib/p7zip/7z a /data/work5/pubme.20200504_14.7z /data/work5/pubme.20200504_14chao 16619 1 31 17:05 ? 00:00:48 /usr/lib/p7zip/7z a /data/work6/iconme.20200504_15.7z /data/work6/iconme.20200504_15chao 16626 1 32 17:05 ? 00:00:48 /usr/lib/p7zip/7z a /data/work6/iconme.20200504_14.7z /data/work6/iconme.20200504_14chao 17655 17134 0 17:07 pts/18 00:00:00 grep --color=auto 7z# 查看压缩过后文件的MD5[root@localhost data]# md5sum /data/work1/readme.20200504_1614e86bbf03c4d98c02cb72ed7b050fe0 /data/work1/readme.20200504_16[root@localhost data]# 7z x /data/work1/readme.20200504_16.7z -o/tmp/7-Zip [64] 9.20 Copyright (c) 1999-2010 Igor Pavlov 2010-11-18p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,4 CPUs)Processing archive: /data/work1/readme.20200504_16.7zExtracting readme.20200504_16Everything is OkSize: 1279203754Compressed: 1296522502# md5 一致压缩正确[root@localhost data]# md5sum /tmp/readme.20200504_1614e86bbf03c4d98c02cb72ed7b050fe0 /tmp/readme.20200504_16
任务3:写一段脚本自动删除5个小时以前的已经压缩好的原始文件。
例如现在时刻是2020年4月25日15点。那么这个脚本就需要负责删除
/data/work1/readme.20200425_09,/data/work2/pubme.20200425_09和/data/work3/iconme.20200425_09。即原始日志只留压缩版本,不留非压缩版本。
当然这个5是可配置的。
[root@localhost data]# cat clean.sh#!/bin/bashbase_path=/dataage=${1-5}start_time=`date -d "-$age hour" "+%Y%m%d_%H"`clean() {dir_path=$1for file_name in `ls -l $dir_path | grep ^- | grep -v 7z$ | awk '{print $9}' | sort -r | awk -F . '{if(\$2 < "'$start_time'" )print \$0}'`dofile_path="$dir_path/$file_name"if [ -n "`lsof -c 7z | grep $file_path.7z`" ]thenecho "$file_path is compressing"continuefiif [ -e "$file_path.7z" ]thenecho "remove $file_path"rm $file_pathfidone}for file_name in `ls -l $base_path | grep ^d | awk '{print $9}'`dofile_path="$base_path/$file_name"clean $file_pathdone
base_path=/data
清空子文件夹
for file_name in ls -l $base_path | grep ^d | awk '{print $9}'
do
file_path=”$base_path/$file_name”
rm -rf $file_path/*
done
创建6个文件夹,每个文件夹中添加10个大文件。如果成功,最后会剩下5个文件
file_prefixs=(“readme” “pubme” “iconme” “readme” “pubme” “iconme”)
for i in {1..6}
do
file_folder=”$base_path/work$i”
mkdir -p $file_folder
file_prefix=${file_prefixs[i-1]}
for j in {1..10}dofile_name="$file_prefix.$(date -d "-$j hour" "+%Y%m%d_%H")"file_path="$file_folder/$file_name"echo $(date "+%Y-%m-%d %H:%M:%S") > $file_pathdonefile_name="$file_prefix.$(date -d "-11 hour" "+%Y%m%d_%H")"file_path="$file_folder/$file_name"cp -f $base_path/temp $file_path
done
压缩文件
./compress.sh &
执行脚本
./clean.sh
由于有9个文件正在压缩,所以还剩10个未压缩的文件
if [ 10 -ne ls /data/work1/ | grep -v 7z$ | wc -l ]
then
echo ‘should have 10 files’
fi
sleep 20
执行脚本
./clean.sh
还有文件正在压缩,所以还剩5个文件
if [ 5 -ne ls /data/work1/ | grep -v 7z$ | wc -l ]
then
echo ‘should have 5 files’
fi
<a name="tbE7N"></a>## 任务4:写一段脚本每小时执行一次,判断每个目录下的带有时间特征的非压缩文件在最近4个小时的文件是否完整,如果不完整自动发邮件报警。例如现在时刻是2020年4月25日15点。那么正常情况下/data/work1/目录下肯定至少应该有<br />/data/work1/readme.20200425_12<br />/data/work1/readme.20200425_13<br />/data/work1/readme.20200425_14<br />如果发现目录下缺少了readme.20200425_13,说明可能应用程序出错了,没有打日志,需要发邮件报警,报警内容为,标题:“文件缺失报警”,内容:“readme.20200425_13不存在”1. 添加邮件服务```bash[root@localhost data]# sudo apt-get install heirloom-mailx# 添加配置文件到 /etc/s-nail.rc 末尾[root@localhost data]# tail /etc/s-nail.rc# trap \"rm -f \\\"${TMPDIR}/${NAIL_FILENAME_GENERATED}\\\"\" \# EXIT INT QUIT PIPE TERM;\# set +C;\# cat > \"${TMPDIR}/${NAIL_FILENAME_GENERATED}\";\# xpdf \"${TMPDIR}/${NAIL_FILENAME_GENERATED}\""# s-it-modeset from=15609831969@163.com smtp=smtp.163.comset smtp-auth-user=15609831969@163.com smtp-auth-password=xxxxxx smtp-auth=login
basepath=/data age=${1-4} start_time=`date -d “-$age hour” “+%Y%m%d%H”`
timearr=()
for((i=0;i<age;i++));
do
time_arr[i]=`date -d “-$i hour” “+%Y%m%d%H”`
done
check() {
dir_path=$1
for prefix_name in ls -l $dir_path | grep ^- | grep -v 7z$ | awk '{print $9}' | sort -r | awk -F . '{if($2>"'$start_time'"){print $1}}' | uniq
do
for((i=0;i<age;i++));
do
file_name=”$prefix_name.${time_arr[i]}”
file_path=”$dir_path/$file_name”
if [ ! -e $file_path ]
then
echo “$file_name 不存在” | mail -s “文件缺失报警” 15609831969@163.com
fi
done
done
}
for file_name in ls -l $base_path | grep ^d | awk '{print $9}'
do
file_path=”$base_path/$file_name”
check $file_path
done
3. 添加定时任务```bash[root@localhost data]# crontab -l* */1 * * * /bin/bash /check.sh[root@localhost data]# systemctl restart cron
