- 简介
Linux crontab是用来定期执行程序的命令,当安装完成操作系统之后,默认便会启动此任务调度命令。crond 命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作. Linux下的任务调度分为两类:系统任务调度和用户任务调度。Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的.
对于centoscat /etc/crontab 配置文件可以看到如下解释: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # .....
- 基本命令
crontab [-u user] file crontab [ -u user ] [ -i ] { -e | -l | -r }• -u user:用于设定某个用户的crontab服务; • file: file为命令文件名,表示将file作为crontab的任务列表文件并载入crontab; • -e:编辑某个用户的crontab文件内容,如不指定用户则表示当前用户; • -l:显示某个用户的crontab文件内容,如不指定用户则表示当前用户; • -r:从/var/spool/cron目录中删除某个用户的crontab文件。 • -i:在删除用户的crontab文件时给确认提示。
1、crontab有2种编辑方式: 直接编辑/etc/crontab文件 crontab –e 其中/etc/crontab里的计划任务是系统中的计划任务;而用户的计划任务需要通过crontab –e来编辑 2、每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。 3、crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。 4、新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。 5、%在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用%来进行转义。 - 基本说明
┌────────── minute (0 - 59) │ ┌──────── hour (0 - 23) │ │ ┌────── day of month (1 - 31) │ │ │ ┌──── month (1 - 12) │ │ │ │ ┌── day of week (0 - 6 => Sunday - Saturday, or │ │ │ │ │ 1 - 7 => Monday - Sunday) ↓ ↓ ↓ ↓ ↓ * * * * *
[命令] 1、星期和数字对应 0 - Sun Sunday 1 - Mon Monday 2 - Tue Tuesday 3 - Wed Wednesday 4 - Thu Thursday 5 - Fri Friday 6 - Sat Saturday 7 - Sun Sunday 2、’day or month‘ 、‘month’ 、‘day of week’ --这三项注意 如果不能确定月份日期和周日期对应关系,可以两个取一个 即规定了 月份和日期 就不选择星期 星期 执行 * 规定了 星期 月份和日期就 * *
- crontab组合设置
设置时间组合: */n 表示每隔n n 表示在n点开始 m,n 表示在m点和n点开始 m-n 表示从m开始到n之间 n * * * * 表示每小时的n分开始执行 */n * * * * 表示每小时每隔n分开始执行 m-n * * * * 表示每小时的m到n分执行 例如: 1 * * * * reboot #表示每个小时的1分开始执行 例如 1:1分 2:1分 3:1分 */2 * * * * reboot #这里的*/2表示每隔2分钟就执行reboot命令了,一小时执行30 */5 * * * * reboot #每隔5分钟执行一次,一小时执行12次 1 1,2 * * * reboot #其中的1,2代表每天的1点和2点的第一分钟的时候执行reboot命令,中间的逗号表示不同的时间点 1 1-3 * * * reboot #其中的1-3表示每天的1点到3点的第一分钟的时候执行reboot命令。“-”可以表示一个时间的范围 1 1 1 * * reboot #表示每个月1号的1点1分执行一次reboot 1 1 1-10 * * reboot #表示每个月1到10号都执行一次reboot 1 1 * 1 * reboot #每年1月的每天执行一次重启 1 1 * * 1 reboot #星期一执行一次重启
- crontab每分钟定时执行:
*/1 * * * * service mysqld restart //每隔1分钟执行一次 * * * * * service mysqld restart //每隔1分钟执行一次;cron默认每1分钟扫描一次,全为*即可 */10 * * * * service mysqld restart //每隔10分钟执行一次
- crontab每小时定时执行:
0 */1 * * * service mysqld restart //每1小时行一次 3,15 * * * * service mysqld restart //每小时的第3和第15分钟执行command 0 */2 * * * service mysqld restart //每2小时执行一次
- crontab每天定时执行:
0 10 * * * service mysqld restart //每天10点执行 30 19 * * * service mysqld restart //每天19点30分执行 3,15 8-11 * * * service mysqld restart //每天上午8-11点的第3和15分钟执行 3,15 8-11 */2 * * service mysqld restart //每隔2天的上午8-11点的第3和15分钟执行
- crontab每周定时执行:
0 10 * * 1 service mysqld restart //每周一10点执行 30 17 * * 5 service mysqld restart //每周五17点30分执行
- crontab每年定时执行
0 10 1 10 * service mysqld restart //每年的10月1日10点执行 0 20 8 8 * service mysqld restart //每年的8月8日20点执行
-
其他例子
30 21 * * * /etc/init.d/smb restart //每晚的21:30重启smb 10 1 * * 6,0 /etc/init.d/smb restart //每周六、周日的1 : 10重启smb * 23-7/1 * * * /etc/init.d/smb restart //晚上11点到早上7点之间,每隔一小时重启smb
- 验证和常见问题解决
- 验证
cat /var/log/cron
- 重启服务和加载配置【Centos7】
yum install crontabs (安装) systemctl enable crond (开机启动) systemctl start crond (启动 `crond` 服务) systemctl stop crond (停止服务) systemctl restart crond (重启服务) systemctl reload crond (重载配置文件) systemctl status crond (查看状态
- 问题1:重复执行
解决策略:flock建立排它锁,如果对进程加了排他锁其他进程无法加锁,可以选择等待超时或马上返回 命令: flock [-sxun][-w #] flock [-sxon][-w #] file [-c] command -s, --shared: 获得一个共享锁 -x, --exclusive: 获得一个独占锁/排他锁 -u, --unlock: 移除一个锁,通常是不需要的,脚本执行完会自动丢弃锁 -n, --nonblock: 如果没有立即获得锁,直接失败而不是等待 -w, --timeout: 如果没有立即获得锁,等待指定时间 -o, --close: 在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控 -c, --command: 在shell中运行一个单独的命令 -h, --help 显示帮助 -V, --version: 显示版本 -w 等待时间,秒
*/1 * * * * flock -xn /tmp/sleeptest.lock -c /tmp/sleeptest.sh >> /tmp/sleeptest.log ## -x 独占锁 -n 直接失败 如发现被锁如就失败不等待,除非解锁。 */1 * * * * flock -x -w 30 /tmp/sleeptest.lock -c /tmp/sleeptest.sh >> /tmp/sleeptest.log ## 如发现被锁等30秒,解锁成功的话就执行。 */3 * * * * flock -xn /tmp/main.lock -c '/usr/bin/python2 /usr/local/lxy_test/auto-iplist/main.py >> /usr/local/lxy_test/auto-iplist/iplist.log' # 每分钟执行一次python脚本
- 问题2:执行不生效
策略:使用组合命令 */3 * * * * flock -xn /tmp/main.lock -c 'cd /usr/local/lxy_test/auto-iplist/ && /usr/bin/python main.py >> /usr/local/lxy_test/auto-iplist/iplist.log'
- 验证



