频道栏目
首页 > 资讯 > Linux > 正文

利用crond实现秒级执行的办法

13-11-24        来源:[db:作者]  
收藏   我要投稿
昨天在设置网站目录的安全时候,为了安全方面的考虑需要将某个目录下的文件3秒清空一次,第一反应是通过cron来解决,可crontab似乎只支持到分,怎么办呢?经过一番努力,终于解决了,分享一下方法,希望帮助到有类似需求的同学。
 
小编在这里先简单介绍下cron是个什么东西。
 
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。以下是这个命令的一些参数与说明:
 
 
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 
 
crontab -l //列出某个用户cron服务的详细内容 
 
crontab -r //删除没个用户的cron服务 
 
crontab -e //编辑某个用户的cron服务 
 
# 配置文件格式说明
# ——分钟 (0 – 59)
 # | ——小时 (0 – 23)
 # | | ——日 (1 – 31)
 # | | | ——月 (1 – 12)
 # | | | | ——星期 (0 – 7)(星期日=0或7)
# | | | | |
 # * * * * * 被执行的命令
 
通过配置文件我们也能发现,cron最多只可以设置到分钟。那我们的需求是每秒,那应该如何解决呢?
 
第一种方法:
 
当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如下:
 
cat kick.sh 
#!/bin/bash
while : ;do
        /home/somedir/scripts.sh 2>/dev/null &
        sleep 3
done
注意:第一次运行时请不要使用bash kick.sh & 这种后台运行的方式,它会僵死的。
 可以把它放到计划任务使其运行,然后将计划任务中的此条目删除即可。最后把这个脚本放到/etc/rc.local让它每次开机都可以被运行。
 
第二种方法:
 
和第一种方法类似,只不过感觉比第一种更便捷一些。
 
 
cat cron-seconds.sh 
 

#!/bin/bash
#For excuting the scripts every 3 seconds in crond.
#20100124.WXG

for((i=1;i<=20;i++));do

        /home/somedir/scripts.sh 2>/dev/null &
        sleep 3
done
 
然后写入的crontab里每分钟执行一次,如下
 
 
crontab -e 
 
* * * * * /bin/bash /home/somedir/cron-seconds.sh 
 
 
第三种方法:
 
那么如何使用计划任务来直接实现呢?
 最后解决方案如下,经验证,脚本运行非常稳定。(脚本作者:findingcc)
 
crontab -e 
 
 
## For excuting scripts.sh every 3 seconds##on 2010-01-22
* * * * *  /home/somedir/scripts.sh
* * * * * sleep 3 &&  /home/somedir/scripts.sh
* * * * * sleep 6 &&  /home/somedir/scripts.sh
* * * * * sleep 9 &&  /home/somedir/scripts.sh
* * * * * sleep 12 &&  /home/somedir/scripts.sh
* * * * * sleep 15 &&  /home/somedir/scripts.sh
* * * * * sleep 18 &&  /home/somedir/scripts.sh
* * * * * sleep 21 &&  /home/somedir/scripts.sh
* * * * * sleep 24 &&  /home/somedir/scripts.sh
* * * * * sleep 27 &&  /home/somedir/scripts.sh
* * * * * sleep 30 &&  /home/somedir/scripts.sh
* * * * * sleep 33 &&  /home/somedir/scripts.sh
* * * * * sleep 36 &&  /home/somedir/scripts.sh
* * * * * sleep 39 &&  /home/somedir/scripts.sh
* * * * * sleep 42 &&  /home/somedir/scripts.sh
* * * * * sleep 45 &&  /home/somedir/scripts.sh
* * * * * sleep 48 &&  /home/somedir/scripts.sh
* * * * * sleep 51 &&  /home/somedir/scripts.sh
* * * * * sleep 54 &&  /home/somedir/scripts.sh
* * * * * sleep 57 &&  /home/somedir/scripts.sh

 

这里的
sleep 57 &&  /home/somedir/scripts.sh
 
是个完整的命令,假如我们要清空/home/91ri.org/log/ 下方的文件 我们可以这样:
* * * * * sleep 3 && rm /home/91ri.org/log/*
* * * * * sleep 6 && rm /home/91ri.org/log/*
* * * * * sleep 9 && rm /home/91ri.org/log/*
 
以此类推
 
那么我还是比较倾向于使用第三种方法的,虽然比较麻烦一点。因为第一种方法和第二种方法并不是严格的间隔3秒执行的,会大于3秒,因为执行脚本scripts.sh也是需要一定时间的,即使已经加了&符号放到了后台执行也会存在一定的误差。如果对于精确度要求不高,推荐使用第二种方法。
 
[附录]
 
网络上还有这么一种写法:
*:10 * * * * rm /home/91ri.org/log/*
 
意为:每10秒执行一次rm /home/91ri.org/log/* 但不知是否是小编个人的问题还是这个命令本身是错误的,经过在centos下测试后,这个是不可以的。那么有兴趣的同学可以自行测试。
 
cron的相关使用文章参考《利用cron做linux rsync+ssh 镜像备份
 
 
from:www.91ri.org

相关TAG标签
上一篇:记一次磁盘性能测试
下一篇:linux rsync+ssh镜像备份
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站