命令记不住

登陆

Linux 系统计划任务

Linux系统计划任务

1.Crond计划任务概述

什么是计划任务,计划任务类似于我们平时生活中的闹钟。
在Linux系统的计划任务服务crond可以满足周期性执行任务的需求。
crond进程每分钟会处理一次计划任务, 计划任务主要是做一些周期性的任务目前最主要的用途是定时备份数据

Schedule one-time tasks with at.   一次性调度执行 at
Schedule recurring jobs with cron. 循环调度执行 cron
Schedule recurring system jobs. 所有计划任务执行中的输出都会以邮件的方式发送给指定用户, 除非重定向


//循环调度执行cron 进程每分钟会处理一次计划任务
[root@x86cloud ~]# systemctl status crond.service
[root@x86cloud ~]# ps aux |grep crond
root      1201  0.0  0.0 126264  1640 ?        Ss   11:15   0:00 /usr/sbin/crond -n 

计划任务分为以下两种情况:
1.系统级别的定时任务:

清理系统缓存
临时文件清理
系统信息采集
日志文件切割

2.用户级别的定时任务:

定时同步互联网时间
定时备份系统配置文件
定时备份数据库文件>

2.crond配置文件详解

文件 说明
/etc/crontab //Crontab配置文件
/etc/cron.deny //该文件中所列用户不允许使用crontab命令
/var/spool/cron/* //所有用户定时文件都存放此目录,文件以用户名命名
/var/log/cron*/ //定时任务执行后的日志文件,可用来回溯

3.crond计划任务管理

crond任务管理

参数  含义                        指定示例
[root@x86cloud ~]# crontab --help
-e      编辑crontab文件内容       crontab -e
-l      查看crontab文件内容       crontab -l
-r      删除crontab文件内容       crontab -r
-u      管理其他用户的计划任务 crontab -u x86cloud -l
注意: crontab {-l -e}实际上就是在操作/var/spool/cron/username

crond时间含义

# 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

// *  表示任意的(分、时、日、月、周)时间都执行
// -  表示一个时间范围段, 如5-7点
// ,  表示分隔时段, 如6,0,4表示周六、日、四
// /1 表示每隔n单位时间, 如*/10 每10分钟

crond编写示例

00 02 * * * ls      //每天2:00整 
00 02 1 * * ls      //每月1号2:00整 
00 02 14 2 * ls     //每年2月14号2:00整 
00 02 * * 7 ls      //每周日2:00整 
00 02 * 6 5 ls      //每年6月的周五2:00整
00 02 14 * 7 ls     //每月14号2:00整或每周日2:00整,这两个时间都执行
00 02 14 2 7 ls     //每年 2 月 14 号 2:00 整 或者 每周日 2:00 整,这两个时间都执行 
00 02 * * * ls      //每天2:00整
*  02 * * * ls      //每天2:00中的每一分钟 (逻辑错误)
* * * * *  ls       //每分钟执行 ls
* * 14 2 *  ls      //2月14号的每分钟(逻辑错误)
*/5 * * * *  ls     //每隔5分钟 
00 02 * 1,5,8 * ls  //每年1,5,8月的每天2:00整 
00 02 1-8 * *  ls   //每月1到8号的2:00整 

crond书写规范

//1.为计划任务增加必要的注释
[root@x86cloud ~]# crontab -l
##time sync by x86cloud 2018-00-00
*/5 * * * * /usr/sbin/ntpdate time.windows.com &>/dev/null

//2.规范计划任务执行脚本存放的路径/soft/scripts/
[root@x86cloud ~]# crontab -l
##backup www to /backup x86cloud 2018-00-00
00 01 * * * /bin/sh /soft/scripts/www_backup.sh &>/dev/null

//3.执行shell脚本任务前加/bin/sh, 脚本结尾加&>/dev/null
//调试好后应屏蔽debug输出信息,避免产生系统垃圾占用过多inode, 如需输出日志, 可重定向至日志文件
[root@x86cloud ~]# crontab -l
####backup www to /backup x86cloud 2018-00-00
00 01 * * * /bin/sh /soft/scripts/www_backup.sh &>/dev/null

4.crond配置编写实例

[root@x86cloud ~]# crontab -e

#每天凌晨切割nginx日志
00 00 * * * /bin/sh -x /soft/scripts/cut_nginx.sh &> /soft/scripts/log/nginx.log

#每天5点备份数据库
00 05 * * * /bin/sh -x /soft/scripts/dump_sql.sh &>/soft/scripts/log/mysql.log

#每5分钟检测数据库是否正常
*/5 * * * * /bin/sh /soft/scripts/start_mysql.sh &>/dev/null


//注意:
1.我们所有的crond服务是运行的程序。而crontab命令用户用来设置定时规则的命令。
2.crond服务是企业生产工作中常用的重要服务,at很少使用,可以忽略。
3.几乎每个服务器都会用到crond服务。

5.crond计划任务调试

1.调整任务每分钟执行, 检测是否是否正常, 有些任务不要频繁执行
2.调整系统时间然后在检测任务, 生产不建议直接使用此方式
3.执行脚本, 将脚本执行输出写入指定日志文件, 观察日志内容是否正常
4.注意一些任务命令带来的问题echo “x86cloud” >>/tmp/xlw.log &>/dev/null
5.命令使用绝对路径, 防止无法找到命令导致定时任务执行故障
6.查看/var/log/cron日志进行调试

  • 建议: 将需要定期执行的任务写入脚本中, 建立/soft/scripts目录统一存放脚本, 脚本中命令必须使用绝对路径,手动执行脚本检测输出是否正常, 然后将脚本加入计划任务测试, 测试后无问题将脚本输出写入对应的日志文件中即可。

  • 1.手动执行保留执行命令的正确结果
  • 2.编写脚本
    脚本需要统一路径/soft/scripts
    脚本开头建议填写注释信息, 包括执行时间、周期、任务
    脚本内容复制执行成功的命令至脚本文件中(减少每个环节出错几率)
    脚本内容尽可能的优化, 使用一些变量或使用简单的判断语句
    脚本执行的输出信息不要随意打印, 可以重定向至其他位置保留或丢入黑洞
  • 3.执行脚本
    使用bash执行, 防止脚本没有增加执行权限(/usr/bin/bash)
    执行命令以及脚本成功后并复制该命令
  • 4.编写计划任务
    加上必要的注释信息, 人、时间、任务
    设定计划任务执行的周期
    粘贴执行脚本的命令(不要>
  • 5.调试计划任务
    增加任务频率测试、调整系统时间测试(不能用于生产)
    检查环境变量问题、检查crond服务产生日志进行排查

6.定时任务命令

crontab   -l      --查看定时任务 --cat /var/spool/cron/root
ctontab   -e      --编辑定时任务 --vi /var/spool/cron/root
crontab: installing new  crontab 这句话,则表示该调度命令已经成功
cron的日志文件 /var/log/cron 运行过程的一个记录

1.备份 cp mv tar --流量低谷期备份
2.定时任务软件分类 --crond(crontab)定时任务软件(软件包cronie)
atd 运行一次
anacron 非7*24小时运行的服务器
3.系统的日志文件

/var/log/messages*   /var/log/secure*  /var/log/cron*

日志切割 logrotate
系统定时任务+logrotate命令 完成对 日志的日志切割/日志轮询

7.优雅的查看日志文件

1. crond的格式

格式    * * * * *   分钟 小时 日期 月份 周   

2. 定时任务中常用的符号

* 每   * * * ** 命令
/n  */10  每隔/每十分钟

-   从那里来到哪里去 07-08
,   分隔

3.写出脚本
每2分钟同步下系统的时间
1.书写命令

/usr/sbin/ntpdate ntp1.aliyun.com
2.写入定时任务

[root@xcloud ~]# crontab -l
#sync time
*/2 * * * * /usr/sbin/ntpdate ntp1.aliyun.com

3.检查结果,查看日志

Jan  1 00:00:22 xcloud crond[1774]: (root) RELOAD (/var/spool/cron/root)
Jan  1 00:00:22 xcloud CROND[4613]: (root) CMD (/usr/sbin/ntpdate ntp1.aliyun.com)
Jan  1 00:00:22 xcloud CROND[4614]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Jul  8 16:36:01 xcloud CROND[4623]: (root) CMD (/usr/sbin/ntpdate ntp1.aliyun.com)

8.命令书写流程

1.先测试命令
2.把命令放到脚本中
3.检查脚本是否可用
4.写定时任务
1).每分钟执行
2).改为要求时间
5.检查结果
3).查看定时任务日志
4).命令是否执行成功

9.定向到黑洞


定时任务中-命令或脚本结果(正确及错误)定向到黑洞(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1
1.没有定向到空案例
【企业案例】如果定时任务规则结尾不加>/dev/null 2>&1或者追加到文件中>>/tmp/oldboy 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常。
定时任务中 命令或脚本的结果 没有定向到空或文件中
1.邮件的软件没有开启------大量小文件堆积在/var/spool/postfix/maildrop/ ---inode满了
2.邮件软件开启了---------定时任务会不断的给root用户发邮件
you have new mail in /var/spool/mail/root

10.定向到空


/dev/null 黑洞
/dev/zero 不断的向外发出数据

>/dev/null 2>/dev/null 
>/dev/null 2>&1 等于  &>/dev/null 

追加到文件 --对的错的放一起

>>/tmp/oldboy.txt 2>&1 

在定时任务中编辑

[root@xcloud ~]# crontab -l
#sync time
*/2 * * * *    /usr/sbin/ntpdate ntp1.aliyun.com           >/dev/null 2>&1
#backup /etc lidao at 2018xxxxx                          
#00 00 * * *   /bin/sh  /server/scripts/bak-etc.sh         >/dev/null 2>&1
#backup gezhong file xxxxxxxxxx
#00  */2 * * *      /bin/sh /server/scripts/bak-conf.sh    >/dev/null 2>&1
#print time 
* * * * * date +\%Y                                         >>/tmp/time.log  2>&1                  

9.定时任务运行脚本时可以识别的PATH只有/usr/bin和/bin

解决:
1.使用命令的绝对路径
2.重新定义环境变量

export PATH=/usr/local/sbin:/usr/local/bin

1.每分钟显示当前系统的ip地址和当前系统的时间 追加到/tmp/ip.log中

ip a xxxxxx
date
ip a s enp4s0 | awk -F"[^0-9.]+" 'NR==3{print $2}'
date +%F-%T
2018-08-04-23:49:05
2.每天晚上12点创建一个 创建一个以ip地址命名的目录,并把/etc/目录打包压缩放在里面,保持每天的压缩包名字不同
1./backup/10.0.0.200
2./backup/10.0.0.200/etc-2018-07-15.tar.gz
---定时任务打包,最好选择相对路径.
完成后
1.脚本内容
2.定时任务内容
3.ls -l 压缩包

[root@xcloud ~]# ip=.hostname -I|awk '{print $1}'.
[root@xcloud ~]# touch $ip.txt
[root@xcloud ~]# ll $ip.txt
-rw-r--r-- 1 root root 0 Jul 15 11:57 10.0.0.200.txt

4.书写脚本

[root@xcloud ~]# cat /server/scripts/bak-adv.sh
ip=.hostname -I|awk '{print $1}'.
mkdir -p /backup/$ip
tar zcf  /backup/$ip/etc-$(date +%F).tar.gz  /etc/

[root@xcloud ~]# sh /server/scripts/bak-adv.sh 
tar: Removing leading ./' from member names
[root@xcloud ~]# tree  /backup/
/backup/
└── 10.0.0.200
    └── etc-2018-07-15.tar.gz

1 directory, 1 file

[root@xcloud ~]# crontab -l
#backup etc
00 00 * * * sh  /server/scripts/bak-adv.sh >/dev/null 2>&1
推荐阅读