我们经常需要安排脚本在某个时间或周期性的运行。 今天介绍两个工具, crontab
(周期性) 与 at
(仅执行一次)。
at
所在目录: /var/spool/at
管理使用限制: /etc/at.allow
和 /etc/at.deny
。 写在 /etc/at.allow
中的用户才能使用 at
。若这两个文件不存在,则只有 root 用户可以使用。
Service常用操作
名称 | 解释 |
---|---|
start | 启动 |
stop | 关闭 |
restart | 重启 |
reload | 重新载入配置 |
status | 查看状态 |
e.g. 启动 at
:
1 | sudo service atd start |
基本格式
格式:
at 选项 参数(时间)
选项
选项 | 解释 |
---|---|
-f | 指定包含具体指令的任务文件 |
-q | 指定新任务的队列名称 |
-l | 显示待执行任务的列表 |
-d | 删除指定的待执行任务 |
-m | 任务执行完成后向用户发送email |
参数
绝对计时
- midnight(深夜),noon(中午),teatime(下午4点)
- hh:mm today , hh:mm tomorrow 。例:14:30 today
- 12小时制 (am, pm)
- 日期的表示的方式有:mm/dd/yy(月/日/年), dd.mm.yy(日.月.年), yy-dd-mm(年-月-日)。
相对计时
at now + 时间数量 时间单位
。时间单位可以是 minutes,hours,days,weeks。e.g.at now + 3 minutes
(3 分钟后)
应用
查看:
1 | atq 或者 at -l |
查看工作内容:
1 | at -c 2 # 2 代表第2项工作内容 |
删除待执行队列中的指定任务:
1 | atrm <jobnumber> |
e.g. 两分钟后写 hello 到 my.txt 中
1 | at now + 2 minutes |
e.g. 今天 18:28 输出时间到 time.log 中
1 | at 18:28 today |
e.g. 在2017年9月29日 18:00关机
1 | at 18:00 2017-9-29 |
e.g. batch:当系统负载小于 1.5 , 或调用 atq 时指定的值才执行任务。
当系统负载小于 1.5 时,执行备份操作。
1 | batch |
Crontab
参考我的另一篇文章: Crontab in Linux
概述
crontab
常见于 Unix 和类 Unix 的操作系统之中(Linux 就属于类 Unix 操作系统)。它通过守护进程 cron 使得任务能够按照固定的时间间隔在后台自动运行。cron 利用的是一个被称为 cron table 的文件,这个文件中存储了需要执行的脚本或命令的调度列表以及执行时间。
和 at 相似,使用限制的配置文件在 /etc/cron.allow
和 /etc/cron.deny
中。当使用者使用 crontab 后,该项工作会被记录到 /var/spool/cron/
里。不同用户执行的任务记录在不同用户的文件中。
特殊字符 | 意义 |
---|
- | 任何时刻
, | 分隔时段,例如0 7,9 * * *
7:00 和 9:00
- | 时间范围,例如
30 7-9 * * *
7点到9点之间每小时的30分
/n | 每隔n单位间隔,例如*/10 * * * *
每10分钟
基本格式
1 | crontab [-u username] [-l|-e|-r] |
选项 | 解释 |
---|---|
-u | 只有root才能进行这个任务,帮其他使用者创建/移除crontab工作调度 |
-e | 编辑crontab工作内容 |
-l | 列出crontab工作内容 |
-r | 移除所有的crontab工作内容 |
注意
“ % ” 在 crontab 文件中,有结束命令行、换行、重定向的作用。前面必须加 ” \ ” 符号转义
* * * * *
代表:
- min (0 - 59)
- hour (0 - 23)
- day (1 - 31)
- month (1 - 12)
- week (0 - 6)
应用
启动:
1 | service rsyslog start |
查看cron运行状态:
1 | ps aux | grep cron |
编辑任务:
1 | crontab -e |
查看任务:
1 | crontab -l |
清除所有任务:
1 | crontab -r |
e.g. 每天每小时的第5分钟执行脚本 test.sh
1 | 05 * * * * /home/test.sh |
e.g. 每天的凌晨的 3、4、5 点执行 test.sh
1 | 00 3,4,5 * * * /home/test.sh |
e.g. 周日每隔 3 小时执行 test.sh
1 | 00 */3 * * 0 /home/test.sh |
e.g. 每天下午 7 点关机
1 | 00 19 * * * /sbin/shutdown -h |
补充
每个用户使用 crontab -e
添加计划任务,系统都会在 /var/spool/cron/crontabs
中,添加一个该用户自己的任务文档,这样为了隔离。
如果是系统级别的定时任务,以 sudo
权限编辑 /etc/crontab
文件就可以。
cron 服务监测时间最小单位是分钟,所以 cron 会每分钟去读取一次 /etc/crontab
与 /var/spool/cron/crontabs
里面的內容。
/etc
下,cron 相关目录 (括号内为系统默认执行时间,可以根据需求修改):
/etc/cron.daily
,每天执行一次 (6:52)/etc/cron.hourly
,每小时执行一次 (第17分钟)/etc/cron.monthly
,每月执行一次 (1号,6:52)/etc/cron.weekly
,每周执行一次 (每周第七天,6:47)