Linux crontab的使用
本节我们简要介绍一下Linux环境下crontab的使用。
1. 使用格式
crontab [-u user] [-l | -r | -e] [-i] [-s]
上面是最常用的一种使用格式。其中:
crontab -l
: 查看现有定时任务crontab -e
: 编辑定时任务
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND * * * * * command
- 第一列表示分钟0~59,每分钟用
*
或者*/1
表示,*/10
表示每10分钟 - 第二列表示小时0~23
- 第三列表示日期1~31
- 第四列表示月份1~12
- 第五列表示星期0~7,其中0或7代表星期天
- 第六列表示要运行的命令
* : (星号)表示所有的值,如 * 16 5 6 *, 表示6月5日16点到17点之间的每分钟执行一次 , : (逗号)表示可选的值,如 3,4,5 16 5 6表示6月5日16点3分、4分、5分中各执行一次 - : (中划线)表示范围,如5-10 16 5 6表示6月5日16点5分到10分,每分钟执行一次 / : (正斜杠)表示频率,如*/10 * * * *表示每10分钟执行一次
2. crontab的用户权限问题
Linux下可以通过创建文件/etc/cron.allow或者/etc/cron.deny来控制权限: 如果/etc/cron.allow文件存在,那么只有这个文件中列出的用户可以使用crontab,同时/etc/cron.deny被忽略; 如果/etc/cron.allow文件不存在,那么文件/etc/cron.deny中列出的用户将不能使用crontab.
3. crontab服务的启动与停止
[root@localhost langdata]# service crond status Redirecting to /bin/systemctl status crond.service ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2017-10-11 19:06:05 PDT; 4 days ago Main PID: 861 (crond) CGroup: /system.slice/crond.service └─861 /usr/sbin/crond -n Oct 11 19:06:05 localhost.localdomain systemd[1]: Started Command Scheduler. Oct 11 19:06:05 localhost.localdomain systemd[1]: Starting Command Scheduler... Oct 11 19:06:05 localhost.localdomain crond[861]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 84% if used.) Oct 11 19:06:06 localhost.localdomain crond[861]: (CRON) INFO (running with inotify support) [root@localhost langdata]# service crond stop Redirecting to /bin/systemctl stop crond.service [root@localhost langdata]# service crond start Redirecting to /bin/systemctl start crond.service [root@localhost langdata]# service crond restart Redirecting to /bin/systemctl restart crond.service # 重新载入配置 [root@localhost langdata]# service crond reload Redirecting to /bin/systemctl reload crond.service
4. 示例
(1) 每分钟向/root/test.txt中打印数据
[root@localhost langdata]# cat /etc/cron.deny [root@localhost langdata]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed * * * * * root echo "hello,world" >> /root/test.txt [root@localhost langdata]# service crond reload Redirecting to /bin/systemctl reload crond.service [root@localhost langdata]# cat /root/test.txt hello,world hello,world hello,world hello,world hello,world
(2) 每2小时执行一次脚本删除过期文件
[root@localhost script]# cat clear.sh #!/bin/sh #echo "remove checkpoint files" >> /root/tesseract-src/script/rm_result.txt count=`find /root/tesseract-src/tesstutorial/chi_simoutput/ -amin +2160 -name "*.checkpoint" | wc -l` total=`find /root/tesseract-src/tesstutorial/chi_simoutput/ -amin +0 -name "*.checkpoint" | wc -l` left=$(($total - $count)) if [ $count -gt 8 ] && [ $left -gt 12 ] then echo "remove $count checkpoint files" >> /root/tesseract-src/script/rm_result.txt find /root/tesseract-src/tesstutorial/chi_simoutput/ -amin +2160 -name "*.checkpoint" -exec rm {} \; fi sed -i '1,10000d' /root/tesseract-src/tesstutorial/chi_simoutput/basetrain.log #find /root/tesseract-src/tesstutorial/chi_simoutput/ -amin +1200 -name "*.checkpoint" -exec rm {} \; #sed -i '1,10000d' /root/tesseract-src/tesstutorial/chi_simoutput/basetrain.log [root@localhost script]# chmod +x clear.sh [root@localhost script]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed * */2 * * * root /root/tesseract-src/script/clear.sh [root@localhost langdata]# service crond restart Redirecting to /bin/systemctl restart crond.service [root@localhost langdata]# service crond status