谭浩的博客

Simple is beauty.

使用 cron 进行任务调度

基本介绍

“Cron” 是类 Unix 系统(Linux,FreeBSD,Mac OS等)上的基于时间的作业调度器。这些任务或作业被称为”Cron Jobs”。Cron 作为一个守护程序运行在系统中,该程序按计划调度相应的任务,计划可以在一个名为”crontab”文件中进行配置。

在大部分 Linux 发行版中,crond 都被自动安装并加入启动脚本中。可以运行下面的的命令,检查其是否在运行中:

1
2
3
root@xxx # ps aux | grep crond
root 462 0.0 0.0 126216 1600 ? Ss 16:39 0:00 /usr/sbin/crond -n
root 2321 0.0 0.0 112660 976 pts/0 R+ 16:48 0:00 grep --color=auto crond

最上面的一行表示 crond 正在运行,最后一行为我们执行的搜索命令。如果没有运行,则可以将 crond 添加到启动脚本中去,或者键入 crond 命令运行。

使用 cron

在系统中存在着不同的使用 cron 的方法:

  • 可以在 /etc目录中的cron.hourlycron.daily 等子目录下放置需要执行的脚本,脚本就会按小时按天执行。
  • 如果需要使用更加灵活的执行时间则可以编辑crontab配置文件,也叫作业列表,主配置文件通常是/etc/crontab

编辑一个任务,以下为具体的编写语法:

最开始的 5 个字段分别代表分、时、日、月、周。如果对某个字段没有特殊的时间要求则可以使用 * 代替,代表取值范围内的所有数字。

一些注意事项:

  • 如果指定了 dom 和 dow ,命令会在满足其中任意一个条件时执行一次。
  • 字段可以接受一个列表,1,2,3以及 1-3都代表了(1和2和3)
  • 字段可以设置步长,*/2代表每隔2步执行一次
  • contab 中也可以添加注释,需要以 # 开头
1
2
3
4
* * * * * command # 每分钟执行一次command
30 2 * * * command # 每天的早上2:30执行一次command
*/5 * * * * command # 每隔5分钟执行一次command
@reboot command # 每次服务重启时执行一次command

关于更多的 crontab 例子,可以访问 https://crontab.guru/ 查看。

类 Unix 系统是多用户的操作系统,因此一些软件也需要支持多用户操作,cron 也是其中一种。每一个用户可以拥有自己的crontab文件,可以通过crontab命令创建修改和删除。这个 crontab 文件通常存储在 /var/spool/cron/crontabs/ (Unix/Slackware/\BSD),/var/spool/cron/ (RedHat)或者/var/cron/tabs/ (SuSE)*中,具体的位置取决了具体的操作系统。

使用crontab命令进行crontab的编辑:

  • crontab -e创建自己的 crontab 文件
  • crontab new_file 使用 new_file 内容代替当前的 crontab
  • crontab -l 列出当前的 crontab
  • crontab -r删除当前的 crontab
  • crontab -u高优先级的用户可以改变低优先级用户的 crontab,其后跟选项-e -l -r

Cron 内置有访问机制可以控制哪些用户可以使用以及哪些用户无法使用,通过配置/etc/cron.allow /etc/cron.deny 两个文件就可以实现访问控制

使用重定向符号 >>可以将输出的信息追加到具体的日志文件中,如果需要将标准错误也记录到日志文件则需要将标准错误信息重定向到标准输出 2>&1