Linux定时任务 crontab

crond 是linux用来定期执行程序的命令。
当安装完成操作系统之后,默认便会启动此任务调度命令。
crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
**注意:**新创建的 cron 任务,不会马上执行,至少要过 2分钟后才可以,当然你可以重启 cron 来马上执行。

1、启动服务

启动crontab服务

# service cron start

查看服务是否已经运行用

# ps -ax | grep cron 

centos7及以上

systemctl status crond
systemctl start crond
systemctl stop crond
systemctl enable crond

 

2、常见操作

当前用户下操作
# crontab -e        查看当前用户下所有的定时任务
# crontab -l        删除当前用户所有的定时任务
# crontab -r        查看当前用户下的定时任务

指定某个用户操作
# crontab -u zhangsan -l  查看指定用户下的定时任务

相关配置文件

/var/spool/cron/root (以用户命名的文件) 是所有默认存放定时任务的文件
/etc/cron.deny 该文件中所列出用户不允许使用crontab命令
/etc/cron.allow 该文件中所列出用户允许使用crontab命令,且优先级高于/etc/cron.deny

/var/log/cron    该文件存放cron服务的日志

 

3、语法详解

时间设置分为5段,精确到分钟,不能精确到秒级。
第6段为用户命令,一般省略用户,表示当前用户。

分     小时    日       月       星期     命令

0-59   0-23   1-31   1-12     0-6     command     


第1列表示分钟0~59 每分钟用*或者 */1表示
第2列表示小时0~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
记住几个特殊符号的含义:

“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

示范例子

分   时    天    月    星期
5    *     *     *      *     ls  指定每小时的第5分钟执行一次ls命令
30   5     *     *      *     ls  指定每天的 5:30 执行ls命令
30   7     8     *      *     ls  指定每月8号的7:30分执行ls命令
30   5     8     6      *     ls  指定每年的6月8日5:30执行ls命令
30   6     *     *      0     ls  指定每星期日的6:30执行ls命令[0表示星期天,1表示星期1,也可以用英文来表示,sun表示星期天,mon表示星期一]
30   3   10,20   *      *     ls  每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25  8-11   *     *      *     ls  每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 *     *     *      *     ls   每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30   6    */10   *      *     ls  每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]


指定用户
50   7    *      *      *     root run-parts /etc/cron.daily   每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 

 

4、常见错误

4.1、脚本无法执行

现象:用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行。

原因:环境变量不对

解决:
1. 脚本中的命令使用绝对命令,如:/usr/local/bin/docker
2. 脚本开头加入环境变量:

#!/bin/bash
source /etc/profile