本帖最后由 jinm 于 2016-4-12 20:52 编辑
由于之前的学习过程对shell不够重视,脚本这一块一直是我的短板。进公司后才真正开始学习shell ,也看了不少但是没有真正在线上写脚本用。
今天主管要求我写一个自动清理日志的脚本。虽然很简单,但是让我迈出了第一步。
要求:两类机器一共386台,写个脚本自动清理这两类机器里面的日志文件。在堡垒机批量发布,也要批量发布到crontab里面
A类机器日志存放路径很统一,B类机器日志存放路径需要用*匹配(脚本里面会体现)
A类:/opt/sendcloud/log/ 删除7天前的
B类: /opt/sendcloud/instances/ 删除15天前的
本来以为两类机器分开写,结果主管要求写在一个脚本里面
最开始的写法是 :
dir1=/opt/sendcloud/log/
dir2=/opt/sendcloud/instances/
if [ -d $dir1];then
find /opt/sendcloud/log/ -mtime +7 |xargs rm -f
elif [ -d $dir2 ];then
find /opt/sendcloud/instances/*/outbound.log* -mtime +15 |xargs rm -f (这类机器在instances下面有若干个文件夹,日志放在其中一个不确定的目录里面)
fi
后来测试发现在A类机器上可以达到预期目的,B类机器上不可以。。检查发现B类机器上居然也有/opt/sendcloud/log/ 这个目录……
本来想用[ -d $dir2 && -d $dir1 ]做elif的语句,结果忘记“并且”的用法……不知道怎么就想到另外一个思路:调换if和elif里面的语句(因为想到A类机器上日志路径很统一,并没有B类机器的/opt/sendcloud/instances/ 目录)。之后的写法如下,并测试成功了。
#!/bin/bash
dir1=/opt/sendcloud/instances/
dir2=/opt/sendcloud/log/
if [ -d $dir1 ];then
find /opt/sendcloud/instances/*/outbound.log* -mtime +15 |xargs rm -f
elif [ -d $dir2 ];then
find $dir2 -mtime +7 |xargs rm -f
fi
之后的批量发布和修改权限755 就是用两条for语句来实现的(分别实例一条,堡垒机做了ssh 直接登录设置),铭哥课程里面有演示过类似用法。
for host in `cat /opt/hosts/outbound_list`;do echo $host; scp clear_inbound_outbound_log.sh root@$host:/root;done
for host in `cat /opt/hosts/inbound`;do ssh $host “chmod 755 clear_inbound_outbound_log.sh”; done
批量发布到A类机器的命令:for host in `cat inbound`;do echo $host;ssh $host "echo '0 0 * * * /bin/bash /root/clear_inbound_outbound_log.sh'>>/var/spool/cron/root";done
这个脚本很简单,主要是根据实际环境和需求来写,还要向其他各期的同学习!
由于之前的学习过程对shell不够重视,脚本这一块一直是我的短板。进公司后才真正开始学习shell ,也看了不少但是没有真正在线上写脚本用。
今天主管要求我写一个自动清理日志的脚本。虽然很简单,但是让我迈出了第一步。
要求:两类机器一共386台,写个脚本自动清理这两类机器里面的日志文件。在堡垒机批量发布,也要批量发布到crontab里面
A类机器日志存放路径很统一,B类机器日志存放路径需要用*匹配(脚本里面会体现)
A类:/opt/sendcloud/log/ 删除7天前的
B类: /opt/sendcloud/instances/ 删除15天前的
本来以为两类机器分开写,结果主管要求写在一个脚本里面
最开始的写法是 :
dir1=/opt/sendcloud/log/
dir2=/opt/sendcloud/instances/
if [ -d $dir1];then
find /opt/sendcloud/log/ -mtime +7 |xargs rm -f
elif [ -d $dir2 ];then
find /opt/sendcloud/instances/*/outbound.log* -mtime +15 |xargs rm -f (这类机器在instances下面有若干个文件夹,日志放在其中一个不确定的目录里面)
fi
后来测试发现在A类机器上可以达到预期目的,B类机器上不可以。。检查发现B类机器上居然也有/opt/sendcloud/log/ 这个目录……
本来想用[ -d $dir2 && -d $dir1 ]做elif的语句,结果忘记“并且”的用法……不知道怎么就想到另外一个思路:调换if和elif里面的语句(因为想到A类机器上日志路径很统一,并没有B类机器的/opt/sendcloud/instances/ 目录)。之后的写法如下,并测试成功了。
#!/bin/bash
dir1=/opt/sendcloud/instances/
dir2=/opt/sendcloud/log/
if [ -d $dir1 ];then
find /opt/sendcloud/instances/*/outbound.log* -mtime +15 |xargs rm -f
elif [ -d $dir2 ];then
find $dir2 -mtime +7 |xargs rm -f
fi
之后的批量发布和修改权限755 就是用两条for语句来实现的(分别实例一条,堡垒机做了ssh 直接登录设置),铭哥课程里面有演示过类似用法。
for host in `cat /opt/hosts/outbound_list`;do echo $host; scp clear_inbound_outbound_log.sh root@$host:/root;done
for host in `cat /opt/hosts/inbound`;do ssh $host “chmod 755 clear_inbound_outbound_log.sh”; done
批量发布到A类机器的命令:for host in `cat inbound`;do echo $host;ssh $host "echo '0 0 * * * /bin/bash /root/clear_inbound_outbound_log.sh'>>/var/spool/cron/root";done
这个脚本很简单,主要是根据实际环境和需求来写,还要向其他各期的同学习!
编辑回复