背景
本地调试,日志文件越积越多,又不想手动删除,想保留近一段时间,删除历史的,并做成自动脚本。
实现
假设日志文件名都为server-log-2019-0201.log,那我们可以删除server*类的文件
1.find命令
find . -name "server*"
查找文件内容修改日期在30天前(含30天)的文件:
find . -name "server*" -mtime +30
其中,与文件有关的时间有三个, mtime(文件内容修改则会改变), ctime(change time, 权限属性修改则会改变), atime (access time),我们使用mtime.
+30 -30 30 含义:
找到文件之后想进行一进步操作,find支持exec扩展,格式: -exec ; 将要做的操作放在-exec ;之间:
find . -name "server*" -mtime +30 -exec ls -l {} \;
{} 代表find找到的结果。
2.Mac下的定时任务
Linux下使用crontab,Mac OS下推荐使用launchctl
1.需要先编写一个xml文件: 在文件中,需要指定Label, Program指定定时任务要执行的脚本,运行时间间隔,同时指定stdin stdout 及erro日志文件 com.test.launchctl.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 名称,要全局唯一 -->
<key>Label</key>
<string>com.test.launchctl</string>
<!-- 要运行的程序 路径 -->
<key>Program</key>
<string>/Users/zhangsan/workspace/shell-demo/10.test-launchctl.sh</string>
<!-- 运行间隔,与StartCalenderInterval使用其一,单位为秒s -->
<key>StartInterval</key>
<integer>15</integer>
<!-- 标准输入文件 -->
<key>StandardInPath</key>
<string>/Users/zhangsan/workspace/shell-demo/log/test-in.log</string>
<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/zhangsan/workspace/shell-demo/log/test-out.log</string>
<!-- 标准错误输出文件 -->
<key>StandardErrorPath</key>
<string>/Users/zhangsan/workspace/shell-demo/log/test-err.log</string>
</dict>
</plist>
文件放到/Library/LaunchAgents目录下(需要sudo权限)
加载文件,查看:
launchctl load /Library/LaunchAgents/com.test.launchctl.plist #加载plist文件
launchctl list | grep com.test.launchctl.plist #查看列表
停止定时任务:
launchctl unload /Library/LaunchAgents/com.test.launchctl.plist #卸载plist文件
3. 自动删除脚本
09.rm-log.sh 脚本:
#! /usr/bin/env bash
set -u
LOG_PATH=/data/applogs
if [ -d $LOG_PATH ]; then
echo 'begin work'
find $LOG_PATH/* -name "server*" -mtime +30 -exec rm -rf {} \;
# find . -name "cat*" -mtime +30 -exec rm -rf {} \;
# find . -name "pigeon*" -mtime +30 -exec rm -rf {} \;
# find . -name "squirrel*" -mtime +30 -exec rm -rf {} \;
echo 'work done'
else
echo $LOG_PATH not exist
fi
定时任务:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 名称,要全局唯一 -->
<key>Label</key>
<string>com.clean.log</string>
<!-- 要运行的程序 路径 -->
<key>Program</key>
<string>/Users/zhangsan/workspace/shell-demo/09.rm-log.sh</string>
<!-- 运行间隔,与StartCalenderInterval使用其一,单位为秒s 7天 -->
<key>StartInterval</key>
<integer>604800</integer>
<!-- 标准输入文件 -->
<key>StandardInPath</key>
<string>/Users/zhangsan/workspace/shell-demo/log/rm-log-in.log</string>
<!-- 标准输出文件 -->
<key>StandardOutPath</key>
<string>/Users/zhangsan/workspace/shell-demo/log/rm-log-out.log</string>
<!-- 标准错误输出文件 -->
<key>StandardErrorPath</key>
<string>/Users/zhangsan/workspace/shell-demo/log/rm-log-err.log</string>
</dict>
</plist>