Linux之crontab的应用

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell脚本。

了解crontab

crontab 是linux定期来执行程序的命令,一般称为“定时任务”。

linux的crontab时间间隔单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常适合周期性的日志分析或数据备份等工作。

crontab基本格式:

  *   *   *   *   *   php test.php >> /dev/null 2>&1
#分   时  日  月  周   |《===========命令行=========》|

代表含义:


分  时  日  月  周
*   *   *   *   *  user-name  命令
|   |   |   |   | 
|   |   |   |   .----- 星期(0-6,0代表星期天)
|   |   |   .--------- 月份(1-12)
|   |   .------------- 日期(1-31)
|   .----------------- 小时(0-23)
.--------------------- 分钟(0-59)

第1列表示分钟1~59 每分钟用或者 /1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令

使用crontab

crond服务操作命令:

  service crond start    //启动服务
  service crond stop     //关闭服务
  service crond restart  //重启服务
  service crond reload   //重新载入配置
  service crond status   //查看服务状态
  cat /var/log/cron      //查看定时任务是否准时调用了,可以/var/log/cron中的运行信息
  cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {} // 查看所有用户的crontab任务

cron常用方法:

  crontab -u  //设定某个用户的cron服务
  crontab -l  //列出某个用户cron服务的详细内容
  crontab -r  //删除没个用户的cron服务
  crontab -e  //编辑某个用户的cron服务

crontab -e 可以像使用vi编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, cron会对其进行必要的完整性检查。

配置文件

在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron]。cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。

/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。

特殊字符

字符 含义
星号(*) 代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。
逗号(,) 表示分隔时段的意思,例如,3, 4, 6, 8 标明这四个指定的整数。
中杠(-) 表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/) 可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
井号开头(#) 的行是注释,不会被处理。

使用实例

命令 含义
* * * * * myCommand 每1分钟执行一次
3,15 * * * * myCommand 每小时的第3和第15分钟执行
3,15 8-11 * * * myCommand 在上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand 每隔两天的上午8点到11点的第3和第15分钟执行
45 4 1,10,22 * * myCommand 每月1、10、22日的4 : 45执行
10 1 * * 6,0 myCommand 每周六、周日的1 : 10执行
0 23-7 * * * myCommand 晚上11点到早上7点之间,每隔一小时执行
0 6-12/3 * 12 * myCommand 在12月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行

注意清理系统用户的日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。 例如,可以在crontab文件中设置如下形式,忽略日志输出:

0 */3 * * * php test.php >/dev/null 2>&1     #不记录脚本输出记录
0 */3 * * * php test.php >> /logs/test.log 1>&1     #将脚本输出信息追加到test.log中
0 */3 * * * php test.php > /logs/test.log 1>&1      #将脚本输出信息记录到test.log中,注意使用 ‘>’ 会覆盖之前的数据

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

定时任务书写要领

  1. 定时任务要加注释
  2. 定时任务命令或脚本结尾加 &>/dev/null 或 >/dev/null 2>&1 或 1>/dev/null 2>/dev/null
  3. 定时任务执行shell脚本前加/bin/sh,定时任务执行shell脚本不必添加执行权限
  4. 定时任务命令或程序尽量写到脚本里,定时任务只要执行脚本即可
    注意操作步骤:
      - 命令行执行
      - 编写脚本
      - 测试脚本
      - 设置定时任务
  5. 生产任务程序不要随意打印输出信息
  6. 定时任务执行的脚本要规范路径 (例如 /server/script)
  7. 配置定时任务要规范操作过程
  8. 定时任务执行特殊的字符需要进行转义,否则会报错,例如 百分号% 转义 \%
  9. 定时任务脚本中如果涉及使用到环境变量,必须在脚本中重新定义,不然,定时任务识别不了

注意用法

星期和天尽量不要同时使用,他们触发的条件是只要满足一个就会执行。

1000

GS

北京 | php攻城狮

创作 35 粉丝 2

fighting