暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

学习使用crontab执行计划任务

Linux驯兽师 2021-08-17
1063

crond简介

crond是Linux下用来周期性地执行某种任务或等待处理某些事件的一个守护进程,与Windows下的计划任务类似。当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程。crond进程每分钟会定期检查是否有任需要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下任务调度分为两类,系统任务调度和用户任务调度。

  • 系统任务调度:系统周期性索要执行的工作,如写缓存数据到硬盘、日志清理等。

    在/etc目录下有一个crontab文件,此文件就是系统任务调度的配置文件。

    上图中SHELL变量指定了系统要使用的Shell;PATH变量指定了系统执行命令的路径;MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量为空,则表示不发送任务执行信息给用户。

  • 用户任务调度:用户定期要执行的工作,如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件都保存在/var/spool/cron目录中。其文件名与用户名一致。

crontab工具的使用

crontab常用格式

crontab [-u user] [file]
crontab [-u user] [-e|-l|-r|-i]
  • -u:user:用来指定某个用户的crontab服务,例如,-u ixdba表示设定ixdba用户的crontab任务

  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件

  • -l:显示某个用户的crontab文件内容。如果不指定用户,则表示显示当前用户的crontab文件内容

  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件

  • -i:在删除用户的crontab文件时给出确认提示

crontab文件的含义

用户所建立的crontab文件中,没遗憾都代表一项任务,每行的每个字段代表一项设置,它的格式共分为6个字段,前五个是时间设定段,第六个是命令段,格式如下:

minute hour day month week command
  • minute:表示分钟,0~59之间任何整数

  • hour:表示小时,0~23之间任何整数

  • day:表示日期,可以是1~31之间任何整数

  • month:表示月份,可以是1~12之间任何整数

  • week:表示星期几,可以是0~7之间的任何整数

  • command:要执行的命令,可以是系统命令,也可以是自己编写脚本文件

以上各字段中还可以使用特殊字符:

  • 型号(*):表示所有可能的值,例如,month字段如果是*,则表示在满足其他字段的制约条件后每月都执行该命令操作

  • 逗号(,):可以用逗号隔开的值指定一个列表范围,如,1,2,5,7,8,9

  • 中杠(-):可以用整数之间的中杠表示一个整数范围,如,2-6表示2,3,4,5,6

  • 正斜线(/):可以用正斜线指定时间的间隔频率,如0-23/2表示每2h执行一次。同时正斜线可以和星号一起使用,如*/10,如果用在minute字段,表示每10min执行一次。

crontab文件举例

每隔3小时执行一次

0 */3 * * * usr/local/apache2/apchectl  restart

每周六的3:30执行/home/backup.sh脚本

30 3 * * 6 home/backup.sh

每月的1号和20号检查磁盘设备

* * 1,20 * * fsck dev/sda1

每个月的5号、10号、15号、20号、25号、30号的5:10执行清理Apache日志任务

10 5 */5 * * echo "">/usr/local/apache2/log/access_log

使用crontab工具的注意事项

  1. 注意环境变量问题

    有时创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab中没有配置环境变量引起的。

    在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置。因为手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行某个任务时,是不会加载任何环境变量的,因此,需要在crontab文件中指定任务运行所需的所有环境变量,这样系统执行任务调度时就不会有问题了。

  2. 注意清理系统用户的邮件日志

    每条任务调度执行完毕,系统都会将任务输出信息通过邮件形式发送给当前系统用户,日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

    例如,可以在crontab文件中设置如下形式,忽略日志输出:

    0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

    >/dev/null 2>&1表示先将标准输出重定向到/dev/null,然后将标准错误输出重定向到标准输出。由于标准输出重定向到了/dev/null,因此标准错误输出也会重定向到/dev/null,这样日志输出问题就解决了。

  3. 系统级任务调度与用户级任务调度

    系统级任务调度主要完成一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议),但是反过来却不行。root用户的任务调度操作可以通过crontab-uroot-e来设置,也可以将调度任务直接写入/etc/crontab文件。需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。




文章转载自Linux驯兽师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论