自己租用了一台阿里云的服务器,然后是按流量收费的,结果发现这天每个小时都有接近600m的公网流量流出,而且每个时段都一致,如果再这样下去,一年得花5k来养活这台机器。。。经过各种排查,发现主要是某个ip流出的流量过多,从阿里云管理控制台禁用该ip后,流量立马下来。 开始怀疑是我服务器被攻击,最后发现其实是我博客链接推动到百度的定时任务写错了,我想的是每天推送一次的,结果每分推送一次。。(话说我一分钟推送一次所有博文链接,百度到现在一篇都不给我收录)。 所以在这里我想介绍下linux定时任务的设置,主要是crontab命令。
crontab
crontab算是linux shell里参数较少的几个命令之一了,只有 [ -u user ] [ -i ] { -e | -l | -r },我来分别介绍下这几个参数。
crontab -u user
指定用户为user,如果在使用过程中不加-u user默认就是当前登陆用户。crontab -e
e是edit,编辑当前用户的定时任务。crontab -l
l是list,列出当前用户所有定时任务。crontab -r
r是remove,删除当前用户所有定时任务。crontab -i -r
-i其实没多大用,和-r搭配使用,和纯-r不同的是,加了-i 删除前需要你确认一次。
crontab的语法格式
crontab的格式很简单,* * * * * shell; 这几个星号分别代表时间,然后星号后面直接跟你需要定时直接的命令,如果你命令太长,你可以把脚本写到文件里,然后执行这个文件。
- 第一个星号 minute 分钟,值为0-59。
- 第二个星号 hour 小时,值从0-23。
- 第三个星号 day 天,值为从1-31。
- 第四个星号 month 月,值为从1-12月,或者简写的英文,比如Nov、Feb等。
- 第五个星号 week 周,值为从0-6或者简写的英文,Wen、Tur等,代表周几,其中0代表周末。
- 所有位置都可以用,表示每个,比如你第三个号位置不写具体的某一天,那么表示每天都执行。
- 还有一种方式是 */2 或 */3……表示每2(分|小时|天|月|周)或者表示每3(分|小时|天|月|周)执行一次,这里还可以是其他值。
我平时的记忆方式为 分 时 日 月 周,这几个字读顺口就很难忘掉了。为了大家更容易理解,我直接来几个例子。
0 0 * * * rm -rf /tmp/*; #每天0点0分删除/tmp/下所有文件
59 12 15 * * reboot; #每月15号12点59分重启系统
*/30 * * * * sh /root/abc.sh; #每隔30分执行下/root/abc.sh文件
0 12 */10 * * uptime >> /root/uptime.txt; #每隔10天的12点,把uptime执行的结果写入/root/uptime.txt
有几点需要注意的。
- 你创建定时任务时所使用的用户需要有权限执行改定时任务,如果没有请以root用户添加定时任务。
- 如果你在系统里的用户被删除,你这个用户所拥有的定时任务也会被删除。
- 我想想,好像木有了,哈哈!
/etc/cron.d/
我们除了直接使crontab命令之外,还可以把定时任务写到/etc/cron.d/下,随便新建个文件,按crontab的语法格式把定时任务写进去就好了,系统就会直接给你按时调度的,但要注意的是,你写进去的任务都是以root用户的权限调度的,如果想以其他用户调取,可以在5个星号后面加用户名,比如0 12 */10 * * ixindoo uptime >> /root/uptime.txt;
以ixindoo执行 uptime这个命令。
暂时就写这么多了,以后想到再补充。。。。