一、什么是定时任务?
周期性的执行任务计划的软件,Linux定时任务的常用软件crond.
二、使用定时任务软件,按需重复执行工作。
例如:备份都是0点以后,2点爬起来备份,4点以后睡觉。
需要写一个程序实现自动备份,然后让定时任务软件帮你执行。
三、如何使用
1)用户定时任务计划
cron是定时任务的软件名。
crond是服务进程名,真正实现定时任务服务。
crontab命令是用来设置定时任务规则的配置命令。
要想配置定时任务,首先启动cron服务
[root@app1 logrotate.d]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2019-06-10 19:56:50 CST; 17min ago
Main PID: 6567 (crond)
CGroup: /system.slice/crond.service
└─6567 /usr/sbin/crond -n
Jun 10 19:56:50 app1 systemd[1]: Started Command Scheduler.
Jun 10 19:56:51 app1 crond[6567]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 36% if used.)
Jun 10 19:56:51 app1 crond[6567]: (CRON) INFO (running with inotify support)
crond服务命令
systemctl start crond.service
systemctl stop crond.service
systemctl enable crond.service
systemctl disable crond.service
内容存放位置/var/spool/cron/
以当前用户名作为文件名
-l 查看已经设置的定时任务
-e 编辑定时任务
-u 查看特定用户下定时任务
编写定时任务的语法
[root@app1 cron]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# 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
# | | | | |
# * * * * * command to be executed
共六列:
第一列:分minute (0 - 59)
第二列:时hour (0 - 23)
第三列:日day of month (1 - 31)
第四列:月month (1 - 12)
第五列:周day of week (0 - 6)
第六列:要执行的任务命令或程序
特殊符号:
- 表示的 每或每一 的意思
00 23 * * * cmd 每天23点00分执行任务
- 连续区间 1-10
00 8-23 * * * cmd 每天8点至23点,每小时执行任务
, 列举 1,2,3,4,8
00 1,2,3,4,8 * * * cmd 每天1点、2点、3点、4点、8点执行任务
/n n是数字,每隔n单位时间
*/10 * * * * cmd 每隔10分钟执行一次任务
30 */6 * * * cmd 每隔6小时的30分执行任务
30 8-12/2 * * * cmd 每天8点至12点,每隔2小时的30分执行任务
45 4 1,10,22 * * cmd 每月1号、10号、22号4点45分执行任务
10 1 * * 6,0 cmd 每周六周日1点10执行任务
yum install ntpdate
crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null
日志信息
/var/log/cron
备注:执行命令最后编写脚本,由cron调用脚本执行定时任务。
2)系统定时任务计划
[root@app1 logrotate.d]# ll /etc/cron.daily/logrotate /etc/logrotate.conf
-rwx------. 1 root root 219 Oct 31 2018 /etc/cron.daily/logrotate
-rw-r--r--. 1 root root 662 Jul 31 2013 //etc/logrotate.conf
四、定时任务书写要领
1)为定时任务添加注释
2)所有定时任务尽量都以脚本的形式执行
3)在执行的shell脚本前加上/bin/sh
4)定时任务中命令或脚本的结尾加 >/dev/null 2>&1
5)在指定用户下执行相关定时任务
6)生产任务计划程序中不要随意打印输出信息,有输出的法办法去掉
7)定时任务执行脚本要存放到规范路径下
8)配置定时任务要规范操作过程,减少出错
9)定时任务脚本中程序命令及路径尽量用全路径
10)时间变量%号要用反斜线转义(只有定时任务里时间命令需要)
11)若脚本中调用了系统环境变量,要重新定义
12)出错或无法执行,检果/var/log/cron日志
五、案例分析
1)环境变量问题
定时任务在执行脚本的时候,多数情况没办法加载环境变量,特别是/etc/profile。
登陆后测试成功,但是添加到定时任务时无法执行。
分析:
命令行以bash登陆
手工登陆后,加载所有环境变量
(/.bash_profile,/.bash_rc,/etc/profile,/etc/bashrc)
定时任务执行脚本属于非登陆状态
解决:
定时任务脚本添加export环境变量
2)No space left on device故障
磁盘满的报错,原因往往是inode被占满。
df -i
分析:
因为定时任务没有加&>/dev/null,定时任务执行的时候把输出给系统root发邮件。 邮件服务器postfix服务默认关闭,所以给系统发的邮件就会产生在临时目录(产 生大量小文件)。
cent6 /var/spool/clientmqueue
cent7 /var/spool/postfix/maildrop/