有时候我们会需要定时执行一些任务,比如定时每n分钟执行一个备份,或者每天凌晨3点执行一个备份,或者每个月5号或者每5天或者每周3执行某个任务,Linux中的定时任务是通过 crontab 来实现的。本文讲的就是 crontab 的使用
本文参考:crontab文档: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
我的系统: Linux Debian
使用流程
- 检查是否安装crontab
- 方法1: 执行
service cron status
- 出现
cron.service - Regular background program processing daemon
说明已安装; - 出现
Unit cron.service could not be found.
说明未安装
- 出现
- 方法2: 执行
service cron
- 出现
[info] Usage: /etc/init.d/cron {start|stop|status|restart|reload|force-reload}.
说明已安装; - 出现
cron: unrecognized service
说明未安装
- 出现
- 如果出现
Unit cron.service could not be found
字样,则将cron改为crond再次执行
- 方法1: 执行
- 没安装就安装:
apt install cron
- 编辑定时任务:
crontab -e
- 添加一行来增加定时执行一条命令(也可能需要按a才能进入编辑模式):
0 0 */7 * * sh /home/backup.sh
,意思是每7天执行一次sh /home/backup.sh
这个命令,命令编写请往下看参数说明。 - 保存编辑: Ctrl+O,出现
FIile name to Write...
,输入回车(Enter)。(也可能需要按Ctrl+C
退出编辑模式,按Shift+W+Q
退出编辑) - 退出: Ctrl+X(也可能需要按
esc
,然后:wq
保存并退出),提示crontab:installing new crontab
表示任务设定成功 - 到这里就完成了设定定时任务的一个流程
注意: 在 crontab 命令中只有绝对路径,不存在相对路径,故执行任何命令都需要写绝对路径
常用命令
- 查看定时任务: crontab -l
- 列出xxx用户的所有调度任务: crontab -l -u xxx
- 编辑定时任务: crontab -e
- 删除所有的定时任务: crontab -r
- 开启crontab服务: service cron start
- 停止crontab服务: service cron stop
- 查看crontab服务状态: service cron status
- 重启crontab服务: service cron restart
- 重新载入crontab任务: service cron reload
- 强制重新载入crontab服务: service cron force-reload
参数说明
官方文档: https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html
crontab定时任务命令格式: <Minute> <Hour> <Day> <Month> <DayOfWeek> 要执行的命令
如图,参数说明:
- Minute: 每个小时的第几分钟执行该任务,星号代表每分钟都执行
- Hour: 每天的第几个小时执行该任务,星号代表每小时
- Day: 每月的第几天执行该任务,星号代表每天都执行
- Month: 每年的第几个月执行该任务,星号代表每个月都执行
- DayOfWeek: 每周的第几天执行该任务,星号代表每周中的每一天都执行
模板
- 每五分钟执行一次命令:
*/5 * * * * 命令
- 每小时执行一次命令:
0 * * * * 命令
,即分钟为0时执行一次命令 - 每2小时执行一次命令:
0 */2 * * * 命令
- 每天执行命令:
0 0 * * * 命令
,即分钟为0,小时为0时执行一次命令 - 每周1执行命令:
0 0 * * 1 命令
,即分钟为0,小时为0,星期为1时执行一次命令。注意: 0 表示星期天, 1 表示星期一,以此类推;也可以用英文来表示,sun 表示星期天,mon 表示星期一等。 - 每月执行命令:
0 0 1 * * 命令
,即分钟为0,小时为0,每月中的第1天时执行一次命令 - 每年执行命令:
0 0 1 1 * 命令
,即分钟为0,小时为0,月份中的第1天,月份为1时执行一次命令
注意: 在 crontab 命令中只有绝对路径,不存在相对路径,故执行任何命令都需要写绝对路径
参数中的符号
- 星号(
*
): 代表所有可能的值,例如Month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 - 逗号(
,
): 可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9” - 中杠(
-
): 可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6” - 正斜线(
/
): 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
案例:
* * * * * touch /home/a.txt
: 每分钟执行一次命令touch /home/a.txt
*/5 * * * * touch /home/a.txt
: 每5分钟执行一次命令touch /home/a.txt
* 3 * * * touch /home/a.txt
: 每天凌晨3点时,每分钟执行一次命令touch /home/a.txt
30 3 * * * touch /home/a.txt
: 每天凌晨3点的30分时,执行一次命令touch /home/a.txt
5 * * * * ls
: 每小时的第5分钟执行 ls 命令30 4 * * * ls
: 每天的 4:30 执行 ls 命令0 * * * * ls
: 每小时的第0分钟执行 ls 命令0 0 * * * ls
: 每天的0点0分执行 ls 命令0 0 * * 0 ls
: 每周的0点0分执行 ls 命令0 0 1 1 * ls
: 每年的1月1号0点0分执行 ls 命令* * * * * touch /home/a.txt
: 每分钟执行一次touch /home/a.txt
3,15 * * * * touch /home/a.txt
: 每小时的第3和第15分钟执行一次touch /home/a.txt
3,15 8-11 * * * touch /home/a.txt
: 在上午8点到11点的第3和第15分钟执行一次touch /home/a.txt
3,15 8-11 */2 * * touch /home/a.txt
: 每两天的上午8点到11点的第3和第15分钟执行一次touch /home/a.txt
3,15 8-11 * * 1 touch /home/a.txt
: 每个星期一的上午8点到11点的第3和第15分钟执行一次touch /home/a.txt
30 6 * * 0 ls
: 每星期日的 6:30 执行 ls 命令。20 7 8 * * ls
: 每月 8号 的 7:20 执行 ls 命令30 5 28 6 * ls
: 每年的 6月28号 5:30 执行 ls 命令30 4 10,20 * * ls
: 每月 10号和20号 的 4:30 执行 ls 命令,注意: " , " 用来连接多个不连续的时间25 8-11 * * * ls
: 每天 8~11点 的第 25 分钟执行 ls 命令,注意: " - " 用来连接连续的时间30 5 */10 * * ls
: 每个月中每隔 10天 的 5:30 执行 ls 命令,即: 每月的 1、11、21、31日 在 5:30 执行一次 ls 命令30 4 * * * root run-parts /etc/cron.daily
每天 4:30 以 root 身份执行 /etc/cron.daily 目录中的所有可执行文件30 21 * * * /etc/init.d/smb restart
: 每晚的21:30重启smb45 4 1,10,22 * * /etc/init.d/smb restart
: 每月1、10、22日的4 : 45重启smb10 1 * * 6,0 /etc/init.d/smb restart
: 每周六、周日的1 : 10重启smb0,30 18-23 * * * /etc/init.d/smb restart
: 每天18 : 00至23 : 00之间每隔30分钟重启smb0 23 * * 6 /etc/init.d/smb restart
: 每星期六的晚上11 : 00 pm重启smb* */1 * * * /etc/init.d/smb restart
: 每一小时重启smb* 23-7/1 * * * /etc/init.d/smb restart
: 晚上11点到早上7点之间,每隔一小时重启smb0 11 4 * mon-wed /etc/init.d/smb restart
: 每月的4号与每周一到周三的11点重启smb0 4 1 jan * /etc/init.d/smb restart
: 一月一号的4点重启smb
真实使用中,一般都是执行自己的可执行文件。但也可以直接执行命令,比如:
0 * * * * cd /data/sync-data/mdd;/data/GoProjects/bin/go-elastic-index -config=mdd.toml >> mdd.log 2>&1
,
上面的命令意思是每小时执行一次,首先通过 cd 命令进入到指定绝对目录下(cd /data/sync-data/mdd
),之后使用绝对路径找到可执行文件(/data/GoProjects/bin/go-elastic-index
)正常执行即可。对应的 mdd.toml 和 mdd.log 都是在 cd 到的目录下(cd /data/sync-data/mdd
),此时就不需要全部写全目录了,如果不使用 cd 命令的写法如下:
0 * * * * /data/GoProjects/bin/go-elastic-index -config=/data/sync-data/mdd/mdd.toml >> /data/sync-data/mdd/mdd.log 2>&1
使用Linux定时任务的案例: Linux定时备份
Q.E.D.