需求
删除指定目录下的日志文件,有且只删除30天及以前的日志文件,30天内的日志文件予以保留
有多台Lunux
服务器均要执行此任务
拆分技术点
删除执行时间范围的日志
查询关键词:linux delete files older than
找到资料:How to Delete Files Older than 30 days in Linux
稍作修改,得到命令
find folderName -type f -mtime +30 -delete
循环文件夹执行此操作
查询关键词:linux loop command
找到资料:How to make a for loop in command line?
得到命令:
for dir in yourSumFolder/*; do (find "$dir" -type f -mtime +30 -delete); done
这里的yourSumFolder
是上面的命令folderName
的父级目录,这句话的意思是,循环yourSumFolder下面的所有子目录,执行find "$dir" -type f -mtime +30 -delete
操作
远程访问服务器
查询关键词:linux remote login with password
然后找到了一个新的关键词sshpass
然后查询关键词:sshpass
查看资料sshpass: An Excellent Tool for Non-Interactive SSH Login – Never Use on Production Server
得到以下命令:
sshpass -p "password" ssh -p portIfNot22 -o StrictHostKeyChecking=no YourAccount@YourIP
远程访问并执行多个命令
根据循环删除文件的指令,我们需要先cd
到yourSumFolder文件夹,然后才能顺利执行脚本,所以会执行多个命令
查询关键词:linux sshpass execute command
找到资料:Execute Commands on Remote Machines using sshpass,How To Run Multiple SSH Command On Remote Machine And Exit Safely
以上两篇资料说使用英文分号;
或者&&
分隔命令都可以,博主最后采用的是&&
写出以下命令:
sshpass -p "password" ssh -p portIfNot22 -o StrictHostKeyChecking=no YourAccount@YourIP "cd yourSumSumFolder && for dir in yourSumFolder/*; do (find "$dir" -type f -mtime +30 -delete); done"
解决报错
尝试执行上述命令,报错:
Pseudo-terminal will not be allocated because stdin is not a terminal.
直接查询错误内容,得到结果:ssh登录问题出现Pseudo-terminal will not be allocated because stdin is not a terminal错误
在命令上加上-tt
sshpass -p "password" ssh -p portIfNot22 -o StrictHostKeyChecking=no YourAccount@YourIP -tt "cd yourSumSumFolder && for dir in yourSumFolder/*; do (find "$dir" -type f -mtime +30 -delete); done"
详细原因可以看Pseudo-terminal will not be allocated because stdin is not a terminal
整合多个服务器的业务脚本
上述指令是远程一台服务器,执行清理日志的指令
所以多台服务器,就是依次连接服务器,执行执行,通过上述的指令,修改IP、密码、端口号、要清理日志的文件目录即可
echo "正在删除服务器A日志..."
sshpass -p "password" ssh -p portIfNot22 -o StrictHostKeyChecking=no YourAccount@YourIP -tt "cd yourSumSumFolder && for dir in yourSumFolder/*; do (find "$dir" -type f -mtime +30 -delete); done"
echo "删除服务器A完成"
echo "正在删除服务器B日志..."
sshpass -p "password" ssh -p portIfNot22 -o StrictHostKeyChecking=no YourAccount@YourIP -tt "cd yourSumSumFolder && for dir in yourSumFolder/*; do (find "$dir" -type f -mtime +30 -delete); done"
echo "删除服务器B完成"
执行
查询关键词:Linux run sh
得到资料:How To Run the .sh File Shell Script In Linux / UNIX
将写好的sh脚本上传服务器,在sh脚本对应目录下执行:
sh xxx.sh
总结
最后做一个总结,这个需求是怎么解决的,学到了什么内容
思路延展
可以写出定时执行这个sh文件,达到定时删除的目的
自己想一下怎么查,关键词应该是什么