[关闭]
@xxliixin1993 2016-04-11T15:15:32.000000Z 字数 1775 阅读 1691

Linux计划任务

linux


计划任务
一次性任务计划:at, batch
周期性任务计划:cron

周期性任务计划:cron

依赖于后台服务,查看运行状态:

  1. service crond status
  2. crond (pid 1680) is running... 表示正在运行

cron任务有两类:
系统cron:/etc/crontab
用户cron:定义在/var/spool/cron/目录中与用户名同名的文件中

每行定义一个独立的任务:

  1. SHELL=/bin/bash
  2. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  3. MAILTO=root
  4. HOME=/
  5. # For details see man 4 crontabs
  6. # Example of job definition:
  7. # .---------------- minute (0 - 59)
  8. # | .------------- hour (0 - 23)
  9. # | | .---------- day of month (1 - 31)
  10. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  11. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  12. # | | | | |
  13. # * * * * * user-name command to be executed
  14. 时间点(周期性任务)
  15. user-name: 用户身份
  16. command: 要运行的任务

注意:建议在定义cron任务时,所用到的命令使用绝对路径;如果脚本,脚本中的命令使用绝对路径 ,或自定一个拥有完整路径的环境变量;

时间

分钟 小时 天 月 周几
注意:天 月和周几一般不同时设置,因为所有时间点要同时满足
每年5月4号3点2分:2 3 4 5 *
每月6号18点20分:20 18 6 * *
每天9点20分:20 9 * * *
每小时的3分时:3 * * * *
每分钟:* * * * *
每周三17点16分:16 17 * * 3

时间表示法:

  1. 每个时间位都应该使用其可用的有效取值范围内的值;*就用于表示使用其所有有效取值;
    17 * * * * /bin/echo "howdy" 每小时的17分时执行一次
    8 9 * * * /bin/echo "howdy"每天的09:08执行
    16 17 * * 3 /bin/echo "howdy"每周三的17:16执行

  2. */#:在对应的时间位有效取值上每#个时间单位一次
    */3 * * * * /bin/echo "howdy"每天每三分钟一次
    9 */3 * * * /bin/echo "howdy"每3小时的09分时一次
    */7 * * * * /bin/echo "howdy"
    注意:并不能精确做到每7分钟一次;

  3. 连续时间点:-
    40 3 * * 1-5 /bin/echo "howdy"每周1-5的3:40执行

  4. 离散时间点:,
    30 2 * * 2,4,6 /bin/echo "howdy"每周的2,4,6的2:30执行任务运行后的结果:邮件发送给任务相关用户;
    丢弃邮件通知:输出重定向
    COMMAND > /dev/null
    COMMAND &> /dev/null
    COMMAND > /dev/null 2>&1
    例: 30 2 * * 2,4,6 /bin/echo "howdy" &>/dev/null
    /dev/null: 软件模拟出的设备,bit bucket,数据黑洞;

crontab命令

crontab命令:
-l: 列出已经定义的所有任务;
-e: 打开编辑界面定义任务;
-r: remove,移除所有任务;
-u USERNAME :root以其他用户的身份运行crontab
-l: 列出已经定义的所有任务;
-e: 打开编辑界面定义任务;
-r: remove,移除所有任务;

crontab会检查语法,并保存在/var/spool/cron/用户名 目录中
注意:删除一个任务应该通过编辑界面删除行实现;
注意:如果crontab中的用户命令中需要使用%时,需要对其进行转义:

  1. * * * * * /bin/touch file-$(date +\%F-\%H-\%M-\%S)
  2. * * * * * /bin/touch file-$(date +'%F-%H-%M-%S')

加锁

当不确定一个cron任务是否会在下一次执行是执行完本次任务,可以考虑用加锁的机制不重复执行,而是执行完一次后在进行下一次。
例:

  1. */20 * * * * flock -xn /tmp/room_delete.lock -c 'cd /www/; php room_delete.php > /dev/null'
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注