Linux 计划任务的分类:
一次性任何计划:
未来的某时间点执行一次任务
at: 专门用来处理一次性任务计划
batch : 系统自行选择空闲时间去执行此处指定的任务
周期性的任务计划:
周期性运行某任务
crontab : 可以根据定义的周期信息, 循环的去做些事情
at 计划任务
at 是由 atd 服务提供的, 依赖与 atd 服务, 需要启动才能实现 at 任务
在 centos6 上可以用 service atd start 来启动服务
在 centos7 上要使用 systemctl start atd.service 来启动服务
使用的命令: at
执行方式:
1) 交互式
2) 输入重定向
3)at f 文件
at 队列存放在 / var/spool/at 目录中
/etc/at.{allow,deny} 控制用户是否能执行 at 任务
白名单:
/etc/at.allow 默认不存在, 只有该文件中的用户才能执行 at 命令
有了白名单, 就不看黑名单了
黑名单:
/etc/at.deny 默认存在, 拒绝该文件中用户执行 at 命令,
而没有在 at.deny 文件中的使用者则可执行
如果两个文件都不存在, 只有 root 可以执行 at 命令
at 命令
at, batch, atq, atrm - queue, examine or delete jobs for later execution
at, 用于在指定时间点执行命令
atq, 列出用户的待做任务, 除了超级用户 root
atrm, 删除任务, 通过工作编码来识别
batch, 当负载平衡水平掉到 0.8 后执行命令
- at [-V] [-q x] [-f file] [-mMlbv] timespec ...
- at [-V] [-q x] [-f file] [-mMlbv] -t time
- at -c job ...
- at [ -rd ] job ...
- atq [-V] [-q x]
- atrm [-V] job ...
- batch
-v: 可以使用较为明显的时间格式列出 at 中的工作列表
-l: 列出目前系统上面所用当前用户的 at 队列, 相当于 atq
-d: 可以取消一个在 at 排程中的工作, 删除指定的作业; 相当于 atrm
-c: 查看具体作业任务也就是查看 / var/spool/at 目录下对应的内容
-f /path/from/somefile : 把 at 要执行的所有任务放置在文件中, 让 at 读取此文件作为要运行的任务
-m: 当任务被完成之后, 将给用户发送邮件, 即使没有标准输出
ctrl + d 或者 ctrl +\ 来正常执行退出
ctrl + c 来取消这次任务
-q queue 使用指定的队列
-M 不发送邮件给用户
-t time 在 time 时间运行任务, 格式为 [[CC]YY]MMDDhhmm[.ss]
-r 相当于 atrm
-b 相当于 batch
at 读取标准输入 stdin, 所以可以用标准重定向的各种方法来进行 at 的读取设置
注意:
作业执行命令的结果中的标准输出和错误以邮件通知给相关用户
TIME:
定义出什么时候进行 at 这项任务的时间
- HH:MM
- HH:MM [YYYY-mm-dd]
- HH:MM [am|pm] [Month] [Date]
- HH:MM [am|pm] + number[minutes|hours|days|weeks]
noon(中午 12 点), midnight, teatime(4pm)
- tomorrow
- now+#{minutes,hours,days, OR weeks}
- HH:MM
- 02:00
在今日的 HH:MM 进行, 若该时刻已过, 则明天此时执行任务
- HH:MM YYYY-MM-DD
- 02:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
- HH:MM[am|pm] [Month] [Date]
- 04pm March 17
- 17:20 tomorrow
- HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某个时间点再加几个时间后才进行该项任务
- now + 5 minutes
- 02pm + 3 days
cront 计划任务
crontab 是由 crond 服务提供的
centos6 中可以使用 service crond start 来启动 crond 服务,
centos7 中要使用 systemctl restart crond.service 来启动服务
使用命令: crontab,crond
程序包:
cronie:
主程序包, 提供 crond 守护进程及相关辅助工具
cronie-anacron :
cronie 的补充程序, 用于监控 cronie 任务执行状况,
如 cronie 中的任务在过去该运行的时间点未能正常运行, 则 anacron 会随后启动一次此任务
crontabs :
包含 CentOS 提供系统维护任务
确保 crond 守护处于运行状态:
- systemctl status crond
- service crond status
计划周期性执行的任务提交给 crond, 到指定时间会自动运行
系统 cron 任务:
系统级别的例行性任务计划, 它的制定是通过编辑以下配置文件来实现
/etc/crontab
用户 cron 任务:
crontab 命令定义
每个用户都有专用的 cron 任务文件
/var/spool/cron/USERNAME
日志路径:
/var/log/cron
系统 cron 任务文件 / etc/crontab 的用法
详情参见 man 4 crontab
- # Example of job definition:
- # .---------------- minute (0 - 59)
- # | .------------- hour (0 - 23)
- # | | .---------- day of month (1 - 31)
- # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
- # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
- # | | | | |
- # * * * * * user-name command to be executed
- @reboot run once after reboot.
- @yearly 0 0 1 1 *
- @annually 0 0 1 1 *
- @monthly 0 0 1 * *
- @weekly 0 0 * * 0
- @daily 0 0 * * *
- @hourly 0 * * * *
前面 5 个 * 表示对应的时间点
user-name: 用户身份
command: 要运行的任务
注意:
建议在定义 cron 任务时, 所用到命令使用绝对路径; 如果是脚本, 脚本中的命令使用绝对路径, 或自定义一个拥有完整路径的环境变量
对于 cron 任务来讲,% 有特殊用途, 如果在命令中要使用 %, 则需要转义 \, 或将 % 放置于单引号中, 则可不用转义
时间表示法:
特定值
给定时间点有效取值范围内的值
*
给定时间点上有效取值范围内的所有值
表示每...
离散取值
#,#,#
连续取值
#-#
在指定时间范围上, 定义步长
*/#: #即为步长, 每 #个时间单位一次
时间格式
从左往右, 第一个 * 点出现的位置就是按照这个对应的时间点进行计算
- @reboot run once after reboot.
- @yearly 0 0 1 1 *
- @annually 0 0 1 1 *
- @monthly 0 0 1 * *
- @weekly 0 0 * * 0
- @daily 0 0 * * *
- @hourly 0 * * * *
- 0 ***** :
系统的计划任务
- /etc/crontab
- /etc/cron.d/ ## 配置文件
- /etc/cron.hourly/ ## 脚本
- /etc/cron.daily/
- /etc/cron.weekly/
- /etc/cron.monthly/
控制用户执行计划任务
/etc/cron.{allow,deny}
allow 的优先级高于 deny, 不被放到 allow 里面, 就没有权限使用 crontab
当 allow 和 deny 都没有时, 只有 root 用户有权限使用 crontab
示例:
晚上 9 点 10 分运行 echo 命令
10 21 * * * centos /bin/echo "Howdy!"
每 3 小时 echo 和 wall 命令
0 */3 * * * centos /bin/echo howdy;/usr/bin/wall welcome to Magedu!
思考:
如何在秒级别运行任务?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20;done
如何实现每 7 分钟运行一次任务?
crontab 命令
- crontab - maintains crontab files for individual users
- crontab [options] file
- crontab [options]
- crontab -n [hostname]
-u <user> 定义用户
-e 编辑用户 crontab 任务
-l 列出用户 crontab 任务
-r 删除用户的
-i 在删除之前进行提示
-n <host> 在集群中设置主机来运行用户的 crontab 任务
-c 在集群中获取主机来运行 crontab 任务
-s selinux 内容上下文
-x <mask> 激活详情
注意:
若需要删除一个任务, 则需要通过编辑界面删除行实现
at 和 crontab 的对比
用一次性作业使用 at, 重复性作业使用 crontab
root 用户能够修改其它用户的作业
- Create at time crontab -e
- List at -l crontab -l
- Details at -c jobnum N/A
- Remove at -d jobnum crontab -r
- Edit N/A crontab -e
运行结果的重定向
没有被重定向的输出会被邮寄给用户, 运行结果的标准输出和错误以邮件通知给相关用户
重定向:
- COMMAND > /dev/null
- COMMAND &> /dev/null
- COMMAND >/dev/null 2>&1
/dev/null: 软件模拟的设备, bit bucket, 数据黑洞
anacron 系统
anacron 处理断电期间没能执行的 cron 任务, anacron 并不是用来取代 crontab
anacron 解决一些非 24 小时在线的 linux 系统上的 crontab 无法正常运行的问题
anacron 并不能指定何时运行某项任务, 而是以天为单位或在启动后立刻进行 anacron 的动作, 它会检查停机期间应该进行但并没有进行的 crontab 任务, 并将该任务运行一遍后, anacron 就会自动停止
anacron 会记录上次 anacron 执行的时间, anacron 会去分析现在的时间与记录上次运行 anacron 的时间, 再次比较后若发现有差异, 那就在某些时刻没有进行计划任务了, 此时 anacron 就会开始运行未进行的 crontab 任务, 所以 anacron 其实也是通过 crontab 来运行的
anacron 是一个程序, 而非一个服务
运行计算机关机时 cron 不运行的任务, CentOS6 以后版本取消 anacron 服务, 由 crond 服务管理
对笔记本电脑台式机工作站偶尔要关机的服务器及其它不一直开机的系统很重要很有用
配置文件:
/etc/anacrontab , 负责执行 / etc/ cron.daily/etc/cron.weekly/etc/cron.monthly 中系统任务
字段 1 : 如果在这些日子里没有运行这些任务
字段 2 : 在重新引导后等待这么多分钟后运行它
字段 3 : 任务识别器, 在日志文件中标识
字段 4 : 要执行的任务
由 / etc/cron.hourly/0anacron 执行
当执行任务时, 更新 / var/spool/anacron/cron.daily 文件的时间戳
来源: http://www.bubuko.com/infodetail-2498031.html