## 定时任务
>[success]linux中使用crontab命令来实现定时任务的
crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。
cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。
crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。
### 特点
#### 1. crontab文件一般位于/etc/下,这里面存放系统运行的的调度程序。
#### 2. 每个用户都会生成一个自动生成一个自己的crontab文件,一般位于/var/spool/cron目录下
#### 3. cron.deny 与 cron.allow文件
>[success]/etc/cron.deny 表示不能使用crontab 命令的用户
/etc/cron.allow 表示能使用crontab的用户。
默认情况下,cron.allow文件不存在。如果两个文件同时存在,那么/etc/cron.allow 优先。如果两个文件都不存在,那么只有超级用户可以安排作业。
### crontab的用法
#### 1. 查看当前用户的定时任务
~~~
shell>crontab -l
#显示结果
* * * * * /home/oracle/test.sh >/dev/null 2>&1
~~~
#### 2.编辑当前用户的定时任务
>[success]可以在编辑状态修改、删除、新增一些定时任务。注释一般用#
~~~
shell>crontab -e
~~~
#### 3.删除当前用户的定时任务
~~~
shell>crontab -r
~~~
### 定时任务的格式
定时任务的格式如下:
~~~
# 23 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1
* * * * * 命令或脚本
~~~
#### 一条定时任务有 6 列组成,每列的含义如下:
crontab 文件中每个条目中各个域的意义和格式:
第一列 分钟: 1——59
第二列 小时: 1——23(0表示子夜)
第三列 日 : 1——31
第四列 月 : 1——12
第五列 星期: 星期0——6(0表示星期天,1表示星期一、以此类推)
第六列 要运行的命令
### 扩展
>[success]在这里先介绍一个命令watch,以周期性的方式执行给定的指令,指令输出以全屏方式显示。watch可以帮你监测一个命令的运行结果。
#### 命令格式:
~~~
watch(选项)(参数)
~~~
#### 选项:
~~~
-n:指定指令执行的间隔时间(秒)默认2秒;
-d:高亮显示指令输出信息不同之处;
-t:不显示标题。
~~~
#### 参数:
~~~
指令:需要周期性执行的指令。
~~~
#### watch实例
~~~
#watch uptime
#watch -t uptime
#watch -d -n 1 netstat -ntlp
#watch -d 'ls -l | fgrep goface' //监测goface的文件
#watch -t -differences=cumulative uptime
#watch -n 60 from //监控mail
#watch -n 1 "df -i;df" //监测磁盘inode和block数目变化情况
#watch cat /tmp/1.txt //监测1.txt的内容
~~~
#### 实列
~~~
5 * * * * ls # 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls #指定每天的 5:30 执行ls命令
30 7 8 * * ls # 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls #指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls #指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1, 以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls #每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls # 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 * * * * ls # 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls # 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]
#每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50 7 * * * root run-parts /etc/cron.daily # [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]
~~~
#### 定时的应用
>前面咱们写了服务器健康状态脚本、磁盘报警脚本、数据库备份脚本。
接下来,就配合定时任务来实现系统监测和数据库的定时备份。
#### 在这里事先把需要加入定时任务的脚本,放到/mybash 目录中
#### 添加如下定时任务
1. 每天上午9点,执行服务器健康态脚本
2. 每周5凌晨3点执行数据库备份脚本
3. 每30分种执行一次磁盘报警脚本
~~~
shell>crontab -e
# 每天上午9点,执行服务器健康态脚本
0 9 * * * /mybash/status.sh
# 每周5凌晨3点执行数据库备份脚本
0 3 * * 5 /mybash/mysql.sh
# 每30分种执行一次磁盘报警脚本
*/30 * * * 0 /mybash/bj.sh
~~~
### 遇到的问题
1. 脚本通过命令可以执行,但是加入定时任务后,无法正常运行
>[info]这个是因为环境变量的问题,因为在定时任务中环境变量没有生效。通常情况下是因为iptables和ifconfig等命令造成的。
### 解决办法:
#### 方法1:
>[success]直接在脚本中加入命令的全路径,如果不清楚命令的路径可以通过whereis命令查看
~~~
whereis iptables
iptables: /sbin/iptables /usr/share/man/man8/iptables.8.gz
~~~
#### 方法2:在脚本中,设置环境变量
>[success]你可以通过脚本设置,也可以通过引入环境变量配置文件的方式。
~~~
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin //在脚本中加入这一句
iptables -A INPUT -p UDP --dport 123 -j ACCEPT
iptables -A OUTPUT -p UDP --sport 123 -j ACCEPT
~~~
或者使用下面的方式引入环境变量
~~~
#!/bin/bash
. /etc/profile # 前面的`点`不能少,其后要有一个空格
iptables -A INPUT -p UDP --dport 123 -j ACCEPT
iptables -A OUTPUT -p UDP --sport 123 -j ACCEPT
~~~
#### 方法3:
>[success]在编写定时任务时,设定环境变量
~~~
crontab -e
# 开始编辑定时任务
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin # 这句是关键
* * * * * /root/mysql.sh
~~~