Crontab 的使用
Crontab 的使用
crontab
用于设置定时任务,通过 cat /etc/crontab
可查看 crontab 示例:
$ 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
根据输出可知,该命令分三部分,
*
设置的循环周期- user-name 指定运行该任务的身份
- 最后一部分是需要运行的脚本路径或具体的命令
身份
期中以什么身份运行脚本,可通过 crontab
的 -u
参数指定,
$ sudo crontab -u user001 -e
上述命令将以 user001
的身份创建并运行 job。
也可以直接编辑 /etc/crontab
文件,该文件中可指定 username:
1 1 * * * user001 user001 /data/home/user001/test.sh
job 的管理
crontab -e
: 编辑或创建 job,配合-u
可操作指定用户的 jobcrontab -l
: 列出 job,配合-u
参数可查看指定用户的 jobcrontab -r
: 删除 job 文件,慎用,没有确认过程直接就删了crontab -i
: 同-r
,但删除前会先确认
循环周期
5 个 *
的位置分别代表了不同时间单位,由左至右依次为,
- 分,取值范围 0 ~ 59
- 时,0 ~23
- 天,1 ~ 31
- 月,1 ~ 12,部分实现支持使用名称 jan,feb,mar,…
- 星期,0 ~ 6,其中星期天为 0,部分实际支持使用名称,sun, mon, tue…
所以如下格式:
30 5 11 12 * echo "hello"
表示 “12 月 11 日的 5:30” 打印 “hello”。
特殊符号
*
期中,*
代表该位置时间单位下所有可取的值,比如第一个位置代表分,指定为 *
时就是每分钟都执行。
所以五个星 * * * * *
表示每分钟。
,
指定多个值时用于逗号分隔,
0,15,30 * * * *
表示当时间为 0,15 或 30 分钟的时候执行。
-
连字符用于指定范围,
0-15,30 * * * *
表示 0~15 之间的每分钟,以及第 30 分钟的时候执行。
/
除号用于设置重复的间隔,
*/15 * * * *
表示每个一刻钟的时候,即 0,15,30,45 这些时刻。
它与 15 * * * *
的区分是后者表示一个值,即 15min 的时候,13:15, 12:15 这些。
非标准的字符串
还有一些方便的预设关键字,但这些都是非标准的,不同机器支持情况不同。
Entry | Description | Equivalent to |
---|---|---|
@yearly (or @annually) |
每年一月午夜 | 0 0 1 1 * |
@monthly |
每月首日午夜 | 0 0 1 * * |
@weekly |
每周天午夜 | 0 0 * * 0 |
@daily (or @midnight) |
每天午夜 | 0 0 * * * |
@hourly |
每小时 | 0 * * * * |
@reboot |
重启时 | N/A |
示例:重启后启动 redis
@reboot /usr/local/bin/redis-server /path/to/redis.conf
一些示例
每分钟打印日期到指定文件,
crontab -e
打开 job 编辑界面- 输入
*/1 * * * * date >> /data/home/wayongliu/foo.txt
然后:wq
保存退出 tail -f
/data/home/wayongliu/foo.txt` 查看结果
实现每隔多少秒执行
因为能设置的最小时间单位为分,需要设置每隔多少秒执行时,就需要变通来实现。
借助 sleep,可不用 crontab, 比如每 5 秒:
#!/bin/bash
while true
do
/home/user/myscript.sh
sleep 5
done
也可以 sleep 与 crontab 结合来用,考虑到每 5 秒,一分钟内即执行 12 次,可以设置 12 个 job:
* * * * * /home/user/myscript.sh
* * * * * sleep 5; /home/user/myscript.sh
* * * * * sleep 10; /home/user/myscript.sh
* * * * * sleep 15; /home/user/myscript.sh
* * * * * sleep 20; /home/user/myscript.sh
* * * * * sleep 25; /home/user/myscript.sh
* * * * * sleep 30; /home/user/myscript.sh
* * * * * sleep 35; /home/user/myscript.sh
* * * * * sleep 40; /home/user/myscript.sh
* * * * * sleep 45; /home/user/myscript.sh
* * * * * sleep 50; /home/user/myscript.sh
* * * * * sleep 55; /home/user/myscript.sh
其中第一个任务会在每分钟开始时执行, 第二个也是每分钟开始执行,不过会 sleep 5s,所以实际是每分钟每 5s 的时候执行, 后面的任务类似,从而达到了需要的效果。