Merikanto

一簫一劍平生意,負盡狂名十五年

Linux Task Scheduling

我们经常需要安排脚本在某个时间或周期性的运行。 今天介绍两个工具, 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
2
3
4
at now + 2 minutes

at> echo "hello" > my.txt
at> <EOT> # 按 ctrl + D 自动出现<EOT>

e.g. 今天 18:28 输出时间到 time.log 中

1
2
3
4
at 18:28 today                                     

at> date > time.log
at> <EOT>

e.g. 在2017年9月29日 18:00关机

1
2
3
4
5
6
at 18:00 2017-9-29                                  

at> sudo /bin/sync
at> sudo /bin/sync # sync 两遍,同步数据。强迫症可以多 sync 几遍
at> sudo /sbin/shutdown -h now
at> <EOT>

e.g. batch:当系统负载小于 1.5 , 或调用 atq 时指定的值才执行任务。

当系统负载小于 1.5 时,执行备份操作。

1
2
3
batch                                
at> sudo /bin/sync
at> <EOT>

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
2
service rsyslog start
cron -f &

查看cron运行状态:

1
2
3
ps aux | grep cron

pgrep 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)