Linux中的计划任务-Crontab
时间:2019-05-05 13:40 来源:linux.it.net.cn 作者:IT
Crontab是什么
Crontab是一个用于设置周期性被执行的任务工具。
被周期性执行的任务我们称为Cron Job
周期性执行的任务列表我们称为Cron Table
Crontab实践
相关工具
开源免费的ssh工具:Putty工具
安装并检查Crontab服务
检查cron服务
检查Crontab工具是否安装:crontab -l,无错误则正常安装
检查crond服务是否启动:service crond status
注:Windows在运行中输入services.msc打开服务管理
安装cron
yum install vixie-cron
yum install crontabs
案例
// 每分钟都打印当前时间到一个日志文件中
#crontab -e
*/1**** date >> /tmp/log.txt
// 保存退出
// 动态查看log.txt最后几行信息
#tail -f /tmp/log.txt
Crontab的基本组成
系统服务 配置工具
--------- ------ --------
|配置文件| -----> |crond| <----- |crontab|
-------- ------ --------
文件方式设置定时任务 每分钟都会从配置文件刷新定时任务 用于调整定时任务
Crontab的配置文件格式
* * * * * COMMAND
| | | | |
| | | | ----->星期0~7(0或者7表示星期天)
| | | ------->月份1~12
| | --------->日期1~31
| ----------->小时0~23
------------->分钟0~59
每晚的21:30重启apache
30 21 * * * service httpd restart
每月1、10、22日的4:45重启apache
45 4 1,10,22 * * service httpd restart
每月1到10日的4:45重启apache
45 4 1-10 * * service httpd restart
每隔两分钟重启apache服务
*/2 * * * * service httpd restart
1-59/2 * * * * service httpd restart
晚上11点到早上7点之间,每隔一小时重启apache
注:分钟不能为*,否则意思为晚上11点到早上7点之间,任何一分钟都可以重启apache
0 23-7/1 * * * service httpd restart
每天18:00至23:00之间每隔30分钟重启apache
0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart
小结
*表示任何时候都匹配
可以用”A,B,C”表示A或者B或者C时执行命令
可以用”A-B”表示A到B之间时执行命令
可以用”*/A”表示A分钟(小时等)执行一次命令
Contab工具的使用
查看某用户的计划任务列表: crontab [-u user] -l
修改某用户的计划任务:crontab -e
查看生成的最终计划任务文件: /var/spool/cron
查看crontab执行日志:tail -f /var/log/cron
注:crontab [-u user] …. 编辑某个用户的crontab任务
Crontab配置文件
全局(系统)配置文件: /etc/crontab
// 编辑/etc/crontab文件
// ***** user-name command
// 每分钟root用户执行计划任务
*/1 * * * * root echo "JOB IN THE /etc/crontab FILE"
其他配置文件:/etc/cron.d/sysstat
// 以root用户编辑/etc/cron.d/sysstat文件
#vim /etc/cron.d/sysstat
// 修改后保存
// 重新载入sysstat文件
#crontab /etc/cron.d/sysstat
在/etc/cron.d/目录下创建计划任务文件corntest
注:crontest文件的计划任务也是可以生效的
#vim crontest
*/1 **** crontester echo "job in crontest file"
// 保存并退出
// crontab 无法管理我们自己创建的crontest文件,但crontest文件中的计划任务已生效
Crontab命令操作的文件
// crontab操作的文件为/etc/spool/cron/root
#crontab -l // 这里默认为root用户
#cat /var/spool/cron/root
// 显示不同用户的计划文件
#ls /var/spool/cron
Crontab日志
/var/log/cron文件保存着cron的任务执行记录
#tail -f /var/log/cron
Crontab常见错误
环境变量
命令行双引号中使用%时,未加反斜线\
第三和第五个域之间执行的是 “或” 操作
分钟设置无用
环境变量
// 在.bash_profile中export一个APPDIR
#vim .bash_profile
APPDIR=/etc
export APPDIR
// 保存并退出
#source .bash_profile
#echo APPDIR
/etc
// 在crontab中打印APPDIR这个环境变量
#crontab -e
*/1 * * * * echo $APPDIR >> /tmp/appdir.log
// 保存退出
#tail -f /tmp/appdir.log
// 显示空行
// 因此crontab任务无法访问环境APPDIR变量
第三和第五个域之间执行的是 “或” 操作
四月的第一个星期日早晨1时59分运行a.sh
// 日期和星期是或操作,下面则表示1号-7号和四月中的星期日那天都会执行
59 1 1-7 4 0 /root/a.sh
// 利用shell命令判断是否是周日来执行脚本,注:这里%要用\转义
59 1 1-7 4 * test `date +\%w` -eq 0 && /root/a.sh
// 注:test的用法
#test 1 = 0 // 不能写成 test 1=0,否则结果为0,test把1=0当成字符串
#echo $?
// 或使用
#test 1 -eq 0
分钟设置无用
两个小时运行一次
// 错误的设置,下面0时每一分钟都可以执行
* 0,2,4,6,8,10,12,14,16,18,20,22 * * * date
// 正确设置
0 */2 * * * date
// 先满足1-20约束,再满足每隔2分钟执行,即1 3 5 7 9 11 .. 19分执行date
1-20/2 * * * * date
Crontab补充
Crontab中最小只能设置到每分钟执行一个命令,如果想没半分钟执行某个命令怎么做到?
通过shell脚本的sleep命令配合Crontab即可完成这一功能
// 例如
date && sleep 30s && date
// 利用sleep休眠30s来延迟执行另一个cmd
#crontab -e
*/1 * * * * date >> /tmp/date.log
*/1 * * * * sleep 30s; date >> /tmp/date.log
(责任编辑:IT)
Crontab是什么 Crontab是一个用于设置周期性被执行的任务工具。 被周期性执行的任务我们称为Cron Job 周期性执行的任务列表我们称为Cron Table Crontab实践 相关工具 开源免费的ssh工具:Putty工具 安装并检查Crontab服务 检查cron服务 检查Crontab工具是否安装:crontab -l,无错误则正常安装 检查crond服务是否启动:service crond status 注:Windows在运行中输入services.msc打开服务管理 安装cron yum install vixie-cron yum install crontabs 案例 // 每分钟都打印当前时间到一个日志文件中 #crontab -e */1**** date >> /tmp/log.txt // 保存退出 // 动态查看log.txt最后几行信息 #tail -f /tmp/log.txt Crontab的基本组成 系统服务 配置工具 --------- ------ -------- |配置文件| -----> |crond| <----- |crontab| -------- ------ -------- 文件方式设置定时任务 每分钟都会从配置文件刷新定时任务 用于调整定时任务 Crontab的配置文件格式 * * * * * COMMAND | | | | | | | | | ----->星期0~7(0或者7表示星期天) | | | ------->月份1~12 | | --------->日期1~31 | ----------->小时0~23 ------------->分钟0~59 每晚的21:30重启apache 30 21 * * * service httpd restart 每月1、10、22日的4:45重启apache 45 4 1,10,22 * * service httpd restart 每月1到10日的4:45重启apache 45 4 1-10 * * service httpd restart 每隔两分钟重启apache服务 */2 * * * * service httpd restart 1-59/2 * * * * service httpd restart 晚上11点到早上7点之间,每隔一小时重启apache 注:分钟不能为*,否则意思为晚上11点到早上7点之间,任何一分钟都可以重启apache 0 23-7/1 * * * service httpd restart 每天18:00至23:00之间每隔30分钟重启apache 0,30 18-23 * * * service httpd restart 0-59/30 18-23 * * * service httpd restart 小结 *表示任何时候都匹配 可以用”A,B,C”表示A或者B或者C时执行命令 可以用”A-B”表示A到B之间时执行命令 可以用”*/A”表示A分钟(小时等)执行一次命令 Contab工具的使用 查看某用户的计划任务列表: crontab [-u user] -l 修改某用户的计划任务:crontab -e 查看生成的最终计划任务文件: /var/spool/cron 查看crontab执行日志:tail -f /var/log/cron 注:crontab [-u user] …. 编辑某个用户的crontab任务 Crontab配置文件 全局(系统)配置文件: /etc/crontab // 编辑/etc/crontab文件 // ***** user-name command // 每分钟root用户执行计划任务 */1 * * * * root echo "JOB IN THE /etc/crontab FILE" 其他配置文件:/etc/cron.d/sysstat // 以root用户编辑/etc/cron.d/sysstat文件 #vim /etc/cron.d/sysstat // 修改后保存 // 重新载入sysstat文件 #crontab /etc/cron.d/sysstat 在/etc/cron.d/目录下创建计划任务文件corntest 注:crontest文件的计划任务也是可以生效的 #vim crontest */1 **** crontester echo "job in crontest file" // 保存并退出 // crontab 无法管理我们自己创建的crontest文件,但crontest文件中的计划任务已生效 Crontab命令操作的文件 // crontab操作的文件为/etc/spool/cron/root #crontab -l // 这里默认为root用户 #cat /var/spool/cron/root // 显示不同用户的计划文件 #ls /var/spool/cron Crontab日志 /var/log/cron文件保存着cron的任务执行记录 #tail -f /var/log/cron Crontab常见错误 环境变量 命令行双引号中使用%时,未加反斜线\ 第三和第五个域之间执行的是 “或” 操作 分钟设置无用 环境变量 // 在.bash_profile中export一个APPDIR #vim .bash_profile APPDIR=/etc export APPDIR // 保存并退出 #source .bash_profile #echo APPDIR /etc // 在crontab中打印APPDIR这个环境变量 #crontab -e */1 * * * * echo $APPDIR >> /tmp/appdir.log // 保存退出 #tail -f /tmp/appdir.log // 显示空行 // 因此crontab任务无法访问环境APPDIR变量 第三和第五个域之间执行的是 “或” 操作 四月的第一个星期日早晨1时59分运行a.sh // 日期和星期是或操作,下面则表示1号-7号和四月中的星期日那天都会执行 59 1 1-7 4 0 /root/a.sh // 利用shell命令判断是否是周日来执行脚本,注:这里%要用\转义 59 1 1-7 4 * test `date +\%w` -eq 0 && /root/a.sh // 注:test的用法 #test 1 = 0 // 不能写成 test 1=0,否则结果为0,test把1=0当成字符串 #echo $? // 或使用 #test 1 -eq 0 分钟设置无用 两个小时运行一次 // 错误的设置,下面0时每一分钟都可以执行 * 0,2,4,6,8,10,12,14,16,18,20,22 * * * date // 正确设置 0 */2 * * * date // 先满足1-20约束,再满足每隔2分钟执行,即1 3 5 7 9 11 .. 19分执行date 1-20/2 * * * * date Crontab补充 Crontab中最小只能设置到每分钟执行一个命令,如果想没半分钟执行某个命令怎么做到? 通过shell脚本的sleep命令配合Crontab即可完成这一功能 // 例如 date && sleep 30s && date // 利用sleep休眠30s来延迟执行另一个cmd #crontab -e */1 * * * * date >> /tmp/date.log */1 * * * * sleep 30s; date >> /tmp/date.log (责任编辑:IT) |