Linux上定期清空持续输出的日志文件
Posted __阿瓜的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux上定期清空持续输出的日志文件相关的知识,希望对你有一定的参考价值。
Linux定期清空持续输出的日志文件的方法(nohup)
前言
在nohup输出文件过程中,很容易出现输出日志文件过大的问题,网上的炫技大佬们太多了,让愚钝的阿瓜很难一下子捕捉到关键信息,虽然方法很简单,但阿瓜记性很差,难免以后不会手忙脚乱,故记录一下阿瓜找到的在不打断进程的条件下定期清空文件最简单的方式,以备后日所需或帮助看到它的你。
方法
- 新建脚本,随意命名,此处命名为
clear.sh
,编辑脚本如下:<\\br>
cat /dev/null > $1
如若只用在清空一个文件上,可以把
$1
替换成文件路径,不需要引号,在第三步中也无需额外参数。
- 为这个脚本赋予执行权限,在命令行执行:
chmod +x clear.sh
或:
chmod 777 clear.sh
- 设置
crond
命令,指定定期间隔:
crontab -e
进入编辑模式后,加入要定期执行的命令,多个命令换行输入即可,如需关停则直接删除相应行,文件路径最好写绝对路径,因为绝对路径绝对不会出错。若要指定每分钟执行一次清空 /data/nohup.out
文件的命令,且脚本绝对路径为 /data/clear.sh
,输入的命令如下:
* * * * * /data/clear.sh "/data/nohup.out"
首次输入时会让用户选择编辑器,只会用
vim
的瓜师傅选择带vim
的选项!
vim
编辑器下,按i
进入编辑模式,编辑完成后,按:
返回终端模式,输入wq!
,保存并强制退出。定时设置:
最开始的五个位置分别为分 时 日 月 星期几
若某个位置为
*
,表示每分/小时/天/月/周都执行一次若某个位置为数字,则指定时间,如:
2 * * * *
表示每小时的第2分钟执行一次若某个位置为
数字-数字
的形式,则指定时间范围,如2-5 * * * *
表示每小时的第2到第5分钟执行一次
- 不管写上去的任务多久执行一次,
crontab
是每分钟都要检查一次有没有脚本要执行的
shell定期删除日志脚本
你好,我对shell脚本不是太熟,现在遇到个需求,要将目录下的隔日日志文件删除,用一个脚本定期执行,怎么去做这个,如目录为/tmp/logs/,下面的日志文件名称为comet.root.....20140721(日期格式).log.版本号,求解,脚本要先处理知道有多少非当日的日志文件,然后对符合规则的文件进行删除操作
目录下的文件hsperfdata comet.master.root.log.INFO.20140722-091429.4698
gopush-cluster-comet.pid
comet.master.root.log.WARNING.20140722-091429.4698 hello
其中带日期的是我要删除的,下面是我的脚本
dt = "date -d '1 days ago' +%Y%m%d"
#计算前一天的日期 files = 'ls /tmp/*log.*.$dt*' for $file in $files
do rm -rf $file done
报错如下,语法有问题,帮忙看下./gf.sh: line 1: dt:
command not found ./gf.sh: |line 2: files: command not found|./gf.sh:
line 6: `$file': not a valid identifier
#!/bin/bash
# vim /etc/cron.d/backup
#Author:xxxx
#Date:20140619
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
DIR="/tmp/logs"
file_num=`find $DIR/*.log.* -mtime +1 |wc -l`
echo "have $file_num file"
find $DIR/*.log.* -mtime +1 |xargs rm -rf \; >/dev/null 2>&1
====================================================
上面脚本能完成你的要求
一定要照你的脚本写,没有测试,你自己修改一下,思路是这样的。
上面的直接用Find找到文件的修改时间,直接定位文件删除。
下面这个匹配文件中的名字中包含指定时间的文件,条件为真,删除。
计算加1.
你自己写的时间匹配有问题好像。
++++++++++++++++++++++++++++++++++++
tianshu=1
m=0
sj=`date +%Y%m%d -d -$tianshuday`
for i in `ls *.log.*`
do
echo $i |grep ”$sj“ && rm -f $i
if [ $? = 0 ];then
m++
fi
done
echo $m本回答被提问者采纳 参考技术B #!/bin/bash
files=$(ls /tmp/logs/)
for file in $files
do
getdate=$(cut -d . -f x $file)
if[ $(date +%y%m%d) -gt $getdate ];then
rm $file
fi
done
PS:其中第五行中的x为文件名中日期格式部分是第几段(以.分割),在第几段则x换成几
补充:报错原因,先检查你的代码头写了#!/bin/bash吗?如果写了再检查你的运行路径对不对,试试绝对路径。最后那个$file的报错,把代码中for循环中file前面的$去掉。
以上是关于Linux上定期清空持续输出的日志文件的主要内容,如果未能解决你的问题,请参考以下文章