数据库运维
记录DBA学习成长历程

第10章:系统定时任务说明

文章目录

1. 定时任务说明

01. 类似生活中使用的闹钟
02. 可以自动完成操作命令
03. 定时备份系统数据信息

网站每天会产生用户访问大量的数据,网站一定要保存好, 每天进行备份(本地 远程备份)
服务器访问用户量比较少的时候做备份合适
原则: 重复性的工作都可以让系统来自动完成
cp 本地备份 避免数据被误删除,避免误修改
scp 远程备份 避免服务器宕机数据丢失的问题
希望服务器自动完成

2. 定时任务软件

—2.1 cronie

默认系统自带定时服务 crond(crontab),系统中主要使用的定时任务软件
[root@linux ~]# rpm -qa cronie
cronie-1.4.11-19.el7.x86_64

—2.2 atd

定时任务只执行一次,一次性定时服务

—2.3 anacron

非7*24小时运行的服务器

—2.4 检查软件是否安装

rpm  --查看安装软件数据包信息
rpm -qa  软件名 --查看是否指定的软件已经安装
rpm -ql  软件名 --查看软件大礼包中都有什么数据信息
rpm -qf 文件绝对路径信息 --查看一个命令文件属于哪个软件大礼包
rpm -qc  软件名 --查看服务的配置文件信息
rpm -ivh 软件包名  --利用rpm安装软件大礼包
rpm -e
rpm -e cronie --nodeps 禁止yum remove卸载软件

3. 定时任务配置

—3.1  系统已经存在的定时任务

系统会自动运行里面的内容(系统中毒的时候)
1)系统定时任务周期:每小时/etc/cron.hourly/
[root@oldboy-xiaodao.com.cn ~]# ll /etc/cron.hourly/test.sh
-rwxr-xr-x 1 root root 53 Jan 26 15:48 /etc/cron.hourly/test.sh
[root@oldboy-xiaodao.com.cn ~]# cat /etc/cron.hourly/test.sh
#!/bin/bash
echo oldboy.info >>/tmp/oldboy_hour.txt

2)系统定时任务周期:每一天 /etc/cron.daily
total 12
-rwx------. 1 root root 219 Apr 11 2018 logrotate
-rwxr-xr-x. 1 root root 618 Mar 18 2014 man-db.cron
-rwx------ 1 root root 208 Apr 11 2018 mlocate
经典应用: 
[root@linux ~]# ll /etc/cron.daily/
total 12
-rwx------. 1 root root 219 Apr 11 2018 logrotate --- 自动切割日志


3)系统定时任务周期:每个月/etc/cron.monthly
total 0

4)系统定时任务周期:每一周 /etc/cron.weekly:
total 0

[root@linux ~]# ll /etc/cron
cron.d/ cron.daily/ cron.deny(定时任务黑名单) cron.hourly/ cron.monthly/ crontab(配置说明文件) cron.weekly/ 
说明: 系统默认定时任务没有1小时以下间隔时间
/etc/cron.deny --- 定时任务黑名单, 阻止哪些用户不能设置定时任务
[root@linux ~]# echo oldboy >>/etc/cron.deny
[root@linux ~]# cat /etc/cron.deny
oldboy

—3.2  自定义设置定时任务

——3.2.1 查看定时任务

1)利用一个命令进行查看
   [root@linux ~]# crontab -l 查看root用户编辑的定时任务信息
2)利用一个文件进行查看
   [root@linux ~]# cat /var/spool/cron/root 查看root用户编辑的定时任务信息
3)伪装身份查看普通用户定时任务
   [root@linux ~]# crontab -u oldgirl -l 

——3.2.2 配置定时任务方式

1)root用户配置定时任务
  [root@linux ~]# crontab -e
  或
  [root@linux ~]# vim /var/spool/cron/root 
2)普通用户配置定时任务 
  [oldboy002@linux ~]$ crontab -e
  或
  [oldboy002@linux ~]$ vim /var/spool/cron/oldboy 

——3.2.3 设置定时任务时间

1)每分钟都执行定时任务
  *(每分钟) *(每小时) *(每天) *(每月) *(每周)

2)*/n 每隔多久
  */10(每隔10分钟) */10(每隔10小时) */10 */10 */10

3)设置具体时间
  0 0 * * * ---00:00执行
  30 14 * * * ---14:30执行
  30 14 */5 * *  ---每隔5天的14:30执行

4)从什么时间到什么时间(连续的范围)
  0 9-11 * * * -  ---每天的9点到11点
5)从什么时间到什么时间(不连续范围) 
  0 00,22-23 * * * ---每天的0点,22点,23点
  10,20 22-23 * * * ---每天的0点,22点,23点的10分和20分执行

常见编写错误:
在编写定时任务的时候, 一定不能把日期和周信息进行同时编辑
如:* * 15 * 5
测验: 编辑定时任务 实现/etc/hosts文件进行备份 /tmp/hosts_bak

—3.3 确认定时任务服务是否正在运行

1)确认定时任务服务是否正在运行
  ps -ef|grep crond
  /etc/init.d/crond status
2)确认定制任务服务是否开机启动
  chkconfig|grep crond
  chkconfig --list crond

—3.4 需求01:每分钟执行定时任务备份文件

需求01. 每分钟执行定时任务,进行备份文件 /etc/hosts
备份时候备份文件名称有日期信息显示,如下
cp -a /etc/hosts /tmp/hosts_2019-1-26_16:00
cp -a /etc/hosts /tmp/hosts_2019-1-26_16:01
编写方式:
* * * * * cp /etc/hosts /tmp/hosts_bak_$(date +%F_%H:%M) --错误
* * * * * cp /etc/hosts /tmp/hosts_bak_$(date +\%F_\%H:\%M) --正确

结论:
1)在定时任务执行的时候, 无法识别定时任务命令中的特殊字符%等
 解决方法:特殊符号前面加上 \ 进行转译
 解决方法:将有特殊符号的命令放入到脚本中进行运行
2)在定时任务中, 操作文件要写好绝对路径信息,如(sh ./backup.sh)

—3.5 需求02:每隔10分钟将几个目录打包

需求02. 每隔10分钟, 将/etc/hosts /etc/hostname /etc/selinux目录进行打包
将数据打包到/tmp/oldboy.tar.gz目录 (利用命令完成)
*/10 * * * * tar zcf /tmp/oldboy.tar.gz /etc/hosts /etc/hostname /etc/selinux/

说明: 想让定时任务快速执行的方法
方法一: 先将定时任务执行的周期改为1分钟
方法二: 直接修改时间, 最好和最终期望执行时间相差1分钟以上
假设定时任务会在 10:00 执行 调整时间修改设置为09:58

—3.6 需求03:每分钟创建一个用户

需求03: 每分钟创建一个用户,自动创建oldgirl100
* * * * * useradd oldgirl100
环境变量:
PS1 
LANG
OLDPWD
UID
PATH环境变量: 记录命令文件可以查找的路径信息

结论:
在定时任务中, 识别的$PATH环境变量信息只有 /usr/bin:/bin
解决方法:a.有些系统的特殊命令需要以绝对路径进行执行
        b.可以在定时任务配置文件开始定义新的PATH环境变量信息(慎用)

—3.7 需求05:不想看到定时任务异常提示信息

需求04: 不想看到定时任务异常提示信息
异常提示:
You have new mail in /var/spool/mail/root: 记录定时任务执行过程中的错误信息


问题一: 磁盘容量容易不够用 block不够用(不要产生 systemctl stop postfix.service)
        /var/spool/mail/root内容不断增加, 占用存储空间不断变大
问题二: 磁盘容量容易不够用 inode不够用(不要产生 systemctl start postfix.service)
       因为当邮件服务停止后, 会在/var/spool/postfix/maildrop/产生大量小文件

结论:根本解决方式, 不让错误信息产生
错误信息 2>/etc/oldboy.txt

查看存储数值会不会增加
[root@linux ~]# cat /var/spool/mail/root |wc -l

—3.8 定时任务编写的注意事项

1)在定时任务执行的时候, 无法识别定时任务命令中的特殊字符%等
  解决方法:特殊符号前面加上 \ 进行转译
  解决方法:将有特殊符号的命令放入到脚本中进行运行
2)在定时任务中, 操作文件要写好绝对路径信息
3)在定时任务中, 识别的$PATH环境变量信息只有 /usr/bin:/bin
  解决方法:a.有些系统的特殊命令需要以绝对路径进行执行
          b.可以在定时任务配置文件开始定义新的PATH环境变量信息(慎用)
4)在执行定时任务时, 最后在所有任务命令后面加上 &>/dev/null或者 >/dev/null 2>&1
  将错误数据信息重定向到系统黑洞中

—3.9 查看定时任务是否执行

[root@linux ~]# tail -f /var/log/cron
Jan 26 17:10:01 oldboy-xiaodao CROND[2224]: (root) CMD (cp /etc/hosts /tmp/hosts_bak_$(date +)
01 02 03 04

01: 定时任务执行的时间
02: 执行定时任务的主机名称
03: 执行哪个用户定义定时任务
04: 执行定时任务的命令信息

4. 定时任务的注意事项

①定时任务规则之前加注释
  表示定时任务在干什么
②使用脚本替代命令执行定时任务
  超过两条命,就用脚本
  脚本相当于命令的合集
③定时任务中date命令%百分号
  * * * * * date +\%F\%T >>/oldboy/time.txt 2>&1 
④运行脚本一定要用/bin/sh /bin/bash
  因为默认脚本没有执行权限
⑤定时任务中-命令或脚本结果(正确及错误)
  定向到黑洞(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt >/dev/null 2>&1  
  将错误数据信息重定向到系统黑洞中
⑥避免不必要的程序及命令输出 
⑦打包压缩使用相对路径(切到目标目录的上一级打包目标)
⑧定时任务脚本中的程序文件 ,尽量用绝对路径 
⑨系统与命令位置有关的环境变量问题 
  $PATH = /usr/bin:/bin

5. 编辑定时任务规范

—5.1 在定时任务中执行命令

第一个历程: 在命令行测试命令是否有问题
第二个历程: 将命令放入到定时任务中
第三个历程: 检查日志文件, 确认命令是否触发

—5.2 在定时任务中执行脚本

第一个历程: 在命令行测试命令是否有问题(测试脚本中命令)
第二个历程: 编写脚本信息, 并且授权脚本文件为执行权限
第三个历程: 命令行直接运行脚本
第四个历程: 编写定时任务的问题
第五个历程: 进行测试

6. 测验练习

1)每分钟将自己的名字追加到/oldboy/oldboy.txt中

第一个历程: 在命令行测试命令是否有问题
echo oldboy >>/oldboy/oldboy.txt
第二个历程: 将命令放入到定时任务中
* * * * * echo oldboy >>/oldboy/oldboy.txt
完善:
# cornd....注释信息
* * * * * /bin/echo oldboy >>/oldboy/oldboy.txt >/dev/null 2>&1 
第三个历程: 检查日志文件, 确认命令是否触发


2)每分钟显示系统时间(年-月-日_周)追加到/tmp/time.log

第一个历程: 在命令行进行测试执行命令
date +%F_%w >>/tmp/time.log
第二个历程: 在脚本文件中编写脚本信息
vim /server/scripts/date_info.sh
/bin/date +%F_%w >>/tmp/time.log
第三个历程: 编写定时任务 
# xxxxx
* * * * * /bin/sh /server/scripts/date_info.sh >/dev/null 2>&1 

3)每天23到第二天7点每隔1小时重启nginx服务
# cronid-02 restart nginx
00 23,0-7 * * * echo "rstart nginx" &>/dev/null
赞(0)
MySQL学习笔记 » 第10章:系统定时任务说明