shell实例利用crontab自动清除日志

本文介绍了一种利用Crontab实现自动清理日志的方法,包括编写Shell脚本、设置计划任务等内容,适用于Linux系统环境。

shell实例利用crontab自动清除日志

      程序运行会产生很多的日志,对于无用的日志手动删除比价麻烦,写一个自动执行的命令是很有必要的。

 

 

删除文件shell命令

 

find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;

 

具体的命令如下:

  find /mnt/tomcat/logs/ -mtime +35 -name "*.log" -exec rm -rf {} \;

 参数及说明:

整句的作用是将 /mnt/tomcat/logs/目录下所有30天前带".log"的文件删除。

find:linux的查找命令,定位文件夹;

/mnt/tomcat/logs/:需要清理的目录;

-mtime:语法结构,固定写法;

+30:天数;

"*.log":*是匹配所有,整个是匹配所有的后缀为.log的文件;

-exec:语法结构,固定写法;

rm -rf:强制循环删除文件,及文件夹;

{} \; :语法结构,固定写法; 

 

crontab计划任务使用

创建脚本文件:

 

#vi del-log.sh

切换到insert模式输入:

  #!/bin/sh  

  find /mnt/tomcat/logs/ -mtime +35 -name "*.log" -exec rm -rf {} \;

 

授权:

chmod +x del-log.sh

增加系统计划任务:

crontab -e

11 11 * * * /mnt/tomcat/logs/del-log.sh >/dev/null 2>&1

这样每天11点11分系统就自动执行del-log.sh文件,即执行find /mnt/tomcat/logs/ -mtime +35 -name "*.log" -exec rm -rf {} \;语句,来对日志文件进行清理。

其他自动清除日志脚本

 
  1. #!/bin/sh  
  2. ###########################  
  3. #delete log blog.duplicatedcode.com  
  4. # in_day_num: like 1 2 is delete 2day ago logs  
  5. # in_log_path like tomcat log home  
  6. ###########################  
  7. in_log_path=${1}  
  8. in_day_num=${2}  
  9. tmp_delete_log=/var/log/deletelog/"`date +%Y%m`.log"  
  10.   
  11. deleteLog()  
  12. {  
  13.     inner_num=${1}  
  14.    #find log  
  15.    echo "[`date`] >> start delete logs---" >> $tmp_delete_log  
  16.    find ${in_log_path} -type f -mtime ${inner_num} -print0 | xargs -0 rm -rf  
  17.    echo "[`date`] >> end delete logs---" >> $tmp_delete_log  
  18. }  
  19. init()  
  20. {  
  21.    mkdir -p /var/log/deletelog/  
  22. }  
  23. main()  
  24. {  
  25.    init  
  26.    if [ -z ${in_log_path} ]; then  
  27.        echo "[`date`] >> error log_path not init---" >> $tmp_delete_log  
  28.        return  
  29.    fi  
  30.    inner_day_num=+7  
  31.    if [[ -n ${in_day_num} ]] && [[ ${in_day_num} -ge 1 ]] ; then  
  32.        ${inner_day_num}=${in_day_num}  
  33.     else  
  34.         ${inner_day_num}="+"${in_day_num}  
  35.    fi  
  36.    deleteLog ${inner_day_num}  
  37. }  
  38. #first run main  
  39. main  
       其中可输入日志所在目录和删除时间(如数字1代表1天前),find -type f -print 时会根据换行或者空格来输出查找的文件,在不同的sh下有不同的反应,如果不做处理结合xargs 进行删除操作,会有影响,所以需要增加-print0用 null来作为边界符号,才敢结合 xargs -0来格式化输入。使用find 的时候 遵循最小结果集原则,find解析式从左到右,所有确保你在最左边的过滤符号能够过滤最大数据。
       该脚本可结合crontab进行自动部署清理日志,在/var/log/deltelog/ 生成按照月的清理日志记录。

Linux下自动清理/tmp文件夹的原理

          Linux系统中/tmp文件夹里面的文件会被清空,至于多长时间被清空,如何清空的?
         在linux中tmpwatch命令的作用是删除一段时间内不使用的文件(removes files which haven’t been accessed for a period of time),在/etc/cron.daily/tmpwatc的计划任务中:
 
  1. #! /bin/sh  
  2. flags=-umc  
  3. /usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \  
  4.         -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \  
  5.         -X '/tmp/hsperfdata_*' 10d /tmp  
  6. /usr/sbin/tmpwatch "$flags" 30d /var/tmp  
  7. for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do  
  8.     if [ -d "$d" ]; then  
  9.         /usr/sbin/tmpwatch "$flags" -f 30d "$d"  
  10.     fi  
  11. done  

tmpwatch参数

-a或–all  删除任何类型的文件。

-m或–mtime   根据文件被更改时间

-c或–ctime     根据文件更改状态时间

-M或–dirtime  根据文件夹被更改时间

-f或–force  强制删除文件或目录,其效果类似rm指令的”-f”参数。

-l  不删除符号链接

-U或–exclude-user=用户名或uid  排除某用户的文件

-x 或–exclude=path 排除某路径

-X 或–exclude-pattern=pattern 排除某规则下的路径

-q或–quiet  不显示指令执行过程。

-v或–verbose  详细显示指令执行过程。

-test  仅作测试,并不真的删除文件或目录。

第一行相当于一些标记(参数),第二行就是针对/tmp目录里面排除的目录,第三行,这是对这个/tmp目录的清理。
/usr/sbin/tmpwatch "$flags" 30d /var/tmp中30d是30天,系统自动清理/tmp文件夹的默认时限是30天,决定了30天清理/tmp下不访问的文件,若想一天一清理的话,把30d改成1d。
如果你设置更短的时间来清理的话,比如说是30分钟、10秒等,在这个文件中设置后,reboot后时间到了也不清理/tmp文件夹里面的内容,因为tmpwatch所在的位置是/etc/cron.daily/目录下,而这个目录是每天执行一次计划任务,所以就不起作用了。

 

 

总结

(1)crontab定时任务在文件清理方面又很大的应用,可以设置关机任务、启动脚本和一些程序的检测操作。

(2)清除日志可采用cat /dev/null > /var/lig/messages,可以防止rm -f导致的程序已经打开文件句柄无法正确释放日志文件和写入、文件显示磁盘空间未释放等问题。

转载于:https://www.cnblogs.com/taoxing/p/8267031.html

<think>我们正在讨论Shell脚本和Crontab的基本内容及常用命令。首先,我会介绍Shell脚本的基础语法,然后介绍Crontab的任务调度命令。注意:所有行内数学表达式(虽然在这个主题中可能很少出现)使用$...$格式,独立公式使用$$...$$格式(但本主题可能不需要复杂公式)。同时,我会在回答中自然地添加引用标识,并生成相关问题。根据用户提供的引用,我们可以总结一些关键点:1.Shell脚本调试常用echo命令打印变量[^1]。2.Crontab的基本命令选项:-e(编辑)、-l(列出)、-r(删除所有)[^2]。3.添加Crontab任务的一种方法:使用`crontab-l`导出当前任务,追加新任务,然后重新导入[^3]。4.在Crontab中指定执行用户[^4]。现在,我将按照以下结构组织回答:一、Shell脚本基础语法二、Crontab任务调度命令三、实例演示四、注意事项注意:由于用户要求使用中文回答,所以以下内容均为中文。</think>### Shell脚本基础语法与Crontab任务调度命令教程 #### 一、Shell脚本基础语法 1. **脚本结构** ```bash #!/bin/bash # 指定解释器 # 注释以#开头 echo "Hello World" # 输出命令 ``` 第一行`#!/bin/bash`(Shebang)声明使用Bash解释器,注释用`#`开头。 2. **变量操作** - 定义变量:`name="value"`(等号两侧无空格) - 使用变量:`$name` 或 `${name}` - 环境变量:`$PATH`, `$HOME`等 ```bash user="Alice" echo "User: $user, Path: ${PATH}" ``` 3. **流程控制** - **条件判断**: ```bash if [ $a -gt $b ]; then echo "a > b" elif [ $a -eq $b ]; then echo "a = b" else echo "a < b" fi ``` 常用判断符:`-eq`(等于)、`-ne`(不等于)、`-f`(文件存在)[^1] - **循环**: ```bash for i in {1..5}; do # 遍历数字 echo "Number: $i" done while [ $count -lt 10 ]; do # 条件循环 ((count++)) done ``` 4. **函数定义** ```bash function log_msg() { echo "[$(date)] $1" >> /var/log/mylog.log } log_msg "Task started" # 调用函数 ``` 5. **调试技巧** 使用`echo`输出变量值快速调试[^1]: ```bash echo "DEBUG: current value=$var" # 关键位置插入输出 ``` --- #### 二、Crontab任务调度 1. **基本命令** - `crontab -e`:编辑当前用户的定时任务(首次会提示选择编辑器) - `crontab -l`:列出所有定时任务 - `crontab -r`:删除所有定时任务(慎用!)[^2] 2. **时间格式语法** ```bash * * * * * command_to_execute │ │ │ │ │ │ │ │ │ └─ 星期几 (0-6, 0=周日) │ │ │ └─── 月份 (1-12) │ │ └───── 日 (1-31) │ └─────── 小时 (0-23) └───────── 分钟 (0-59) ``` 示例: - `0 3 * * * /backup.sh`:每天凌晨3点执行 - `*/15 * * * * /monitor.sh`:每15分钟执行 - `0 9 * * 1-5 /report.sh`:周一至周五早9点执行 3. **添加任务的两种方式** - **直接编辑**: ```bash crontab -e # 在打开的文件中添加新行:* * * * * /path/script.sh ``` - **通过配置文件**: ```bash crontab -l > conf # 导出当前任务 echo "0 4 * * * /cleanup.sh" >> conf # 追加新任务 crontab conf # 重新导入 rm conf # 删除临时文件[^3] ``` 4. **执行用户与路径问题** - 任务默认以当前用户身份运行,如需指定用户: ```bash 0 * * * * weblogic /app/weblogic/start.sh # 用户名为weblogic[^4] ``` - 脚本中建议使用**绝对路径**(因Cron环境变量与终端不同) --- #### 三、实例演示 **场景**:每天凌晨压缩日志文件 1. 创建脚本`/opt/scripts/log_archive.sh`: ```bash #!/bin/bash tar -czf /backups/logs_$(date +\%Y\%m\%d).tar.gz /var/log/app/*.log ``` > 注:`%`需转义为`\%`避免Cron解析错误 2. 添加定时任务: ```bash crontab -e # 插入行: 0 2 * * * /opt/scripts/log_archive.sh # 每天2:00执行 ``` 3. 查看任务: ```bash crontab -l # 确认任务已添加 ``` --- #### 四、注意事项 1. **权限问题** - 脚本需有可执行权限:`chmod +x script.sh` - 输出重定向:`>> /path/log 2>&1` 记录日志/错误 2. **环境变量** 在脚本开头显式设置PATH: ```bash export PATH=/usr/local/sbin:/usr/local/bin:$PATH ``` 3. **调试流程** - 先手动执行脚本确认无错误 - 在Cron任务中临时添加邮件通知: ```bash MAILTO="admin@example.com" * * * * * /script.sh # 错误会发送到邮箱 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值