Mac OS下使用Shell脚本自动删除指定日志文件

0 阅读2分钟

背景

本地调试,日志文件越积越多,又不想手动删除,想保留近一段时间,删除历史的,并做成自动脚本。

实现

假设日志文件名都为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 含义:

image.png

找到文件之后想进行一进步操作,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>