Linux常用命令-crontab

命令

crontab

描述

maintains crontab files for individual users
设置计划任务

用法

1
2
crontab [options] file
crontab [options]

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Options:
-u 指定用户
-e 编辑crontab
-l 显示crontab
-r 清空crontab
-i 清空前提示

crontab格式说明
* * * * * user-name command or script path
分 时 日 月 周 用户名 执行命令或脚本

* 表示所有值,如月份为*则表示从1月到12月每个月执行一次
/ 表示间隔时间,如分钟为*/10则表示每10分钟执行一次
- 表示区间,如小时为1-6/2则表示在每天的1-6点之间每2小时执行一次
, 表示指定值,如分钟为10,20,40则表示在10分,20分,40分钟的时候分别执行一次

注意

crontab的运行依赖/usr/sbin/crond进程,用户的crontab保存在/var/spool/cron目录下,用户名即为文件名

系统通过/etc/cron.allow或/etc/cron.deny来控制用户是否有crontab权限,
如果cron.allow文件存在,则只有在该文件中指定的用户才有权限使用crontab;
如果cron.deny文件存在,则只有不在该文件中的用户才能使用crontab;
如果两个文件都存在,则只允许root用户使用crontab.
系统默认已创建cron.deny空文件,即允许所有用户使用crontab.

注意crontab的PATH路径并非系统当前的$PATH,建议使用绝对路径指定命令,包括脚本中的命令,或者在脚本中引用环境变量文件如.bashrc,避免任务执行失败

在线crontab表达式执行时间计算
https://www.matools.com/crontab/

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 默认crontab的SHELL为bash,PATH路径如下
$ more /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

# 查询crond服务的运行情况
$ systemctl list-units --type service | grep cron
crond.service loaded active running Command Scheduler
$ systemctl list-unit-files | grep cron
crond.service enabled
# 注意crontab的文件权限为600
$ ll /var/spool/cron/
-rw------- 1 root root 60 Feb 25 21:08 root
-rw------- 1 usera usera 19 Feb 25 20:57 usera

# 编辑crontab
$ crontab -e
0 1 * * * echo aaa
# 查看crontab
$ crontab -l
0 1 * * * echo aaa
$ more /var/spool/cron/root
0 1 * * * echo aaa
# 查看指定用户的crontab,注意不要编辑其他用户的crontab,否则可能导致文件权限不对无法执行
$ crontab -l -u usera
* * * * * echo bbb

# 批量替换crontab,注意提前做好备份
$ crontab -l
0 1 * * * echo aaa
# 创建一个crontab列表文件导入即可,注意会覆盖之前的crontab
$ more file
1 2 * * * echo aaa
5 3 * * * echo bbb
*/10 * * * * echo ccc
$ crontab file
$ crontab -l
1 2 * * * echo aaa
5 3 * * * echo bbb
*/10 * * * * echo ccc


# 每1分钟执行一次cmd
* * * * * cmd
# 每小时的第15分和第30分钟执行cmd
15,30 * * * * cmd
# 每天的8-11点的第15分和第30分钟执行
15,30 8-11 * * * cmd
# 每间隔2天的8-11点的第15分和第30分钟执行
15,30 8-11 */2 * * cmd
# 每周一的8-11点的第15分和第30分钟执行
15,30 8-11 * * 1 cmd
# 每天的22:30执行
30 22 * * * cmd
# 每月1,10,20号的22:30执行
30 22 1,10,20 * * cmd
# 每周六和周日的22:30执行
30 22 * * 6,0 cmd
# 每天20-24点间隔30分钟执行,有两种写法
0,30 20-24 * * * cmd
*/30 20-24 * * * cmd
# 每隔2小时执行
0 */2 * * * cmd
# 每月4号和每周一到周三的11点执行
0 11 4 * 1-3 cmd
# 1月1号4点执行
0 4 1 1 * cmd
# 每周一到周五的上午3:15执行
15 3 * * 1-5 cmd