定时任务
一、概述
定时任务:用于执行在Linux中的重复行工作:命令(同步系统时间),脚本(备份,系统巡检)
类似于闹钟
二、服务使用流程
服务使用流程 | 说明 |
---|---|
部署 | 安装这个服务或软件 |
配置 | 如何使用这个服务通过配置文件,通过命令 |
优化或注意事项 | 为了安全 |
排障 | 通过错误提示解决 学会看日志 高级:让服务输出错误提示或输出更加详细的错误提示(通过重定向) |
其他 | 做好监控 做好备份 做好日志收集 统一认证 |
三、部署定时任务
定时任务包的名字:cronie
服务名称(进程):crond
[root@lnh ~]# rpm -qa |grep cronie
cronie-anacron-1.4.11-23.el7.x86_64
cronie-1.4.11-23.el7.x86_64
[root@lnh ~]# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab
/usr/lib/systemd/system/crond.service
/usr/sbin/crond
/usr/share/doc/cronie-1.4.11
/usr/share/doc/cronie-1.4.11/AUTHORS
/usr/share/doc/cronie-1.4.11/COPYING
/usr/share/doc/cronie-1.4.11/ChangeLog
/usr/share/doc/cronie-1.4.11/INSTALL
/usr/share/doc/cronie-1.4.11/README
/usr/share/man/man1/crontab.1.gz
/usr/share/man/man5/crontab.5.gz
/usr/share/man/man8/cron.8.gz
/usr/share/man/man8/crond.8.gz
/var/spool/cron
目录结构 | 说明 |
---|---|
/var/spool/cron | 用户的定时任务的配置文件的目录 |
crontab | 定时任务管理的命令 |
/var/log/cron | 定时任务日志 |
了解的配置文件 | |
/etc/crontab | 不推荐使用这个,系统定时任务的配置文件 |
/etc/cron.hourly/ | 系统定时任务,每小时运行 |
/etc/cron.daily/ | 系统定时任务,每天运行 |
/etc/cron. | 系统定时任务,每周运行 |
/etc/cron. | 系统定时任务,每个月运行 |
四、完全使用指南
1.配置的命令
选项 | 说明 | |
---|---|---|
crontab -e | edit 编辑当前用户的定时任务 | vi /var/spool/cron/root #root当前的用户的名字 |
crontab -l | list 查看当前用户的定时任务 | cat /var/spool/cron/root #root当前的用户的名字 |
[root@lnh ~]# crontab -l
no crontab for root
#用户未设置定时任务
[root@lnh ~]# crontab -e
no crontab for root - using an empty one
#用户未设置定时任务 新建一个空的
crontab: installing new crontab
# 更新了定时任务的配置
2. 定时任务书写格式 必会
#每天早上8:30分 去学校(go to school)
30 08 * * * go to school
#晚上12点上床睡觉(go to bed/sleep)
00 00 * * * go to bed
#注:
#* 00 * * * go to bed 这个格式表示每天的半夜12点00-59 每分钟运行
#表示整点的时候,未说明分钟的时候,我们要指定的分钟,一般是00
3. 定时任务时间部分的特殊符号 必会
时间部分特殊符号 | 说明 | 案例 |
---|---|---|
/ | 每隔xxx时间 | */2 * * * * 每2分钟 00 */2 * * * 每2个小时 |
- | 表示范围 | 00 08-22 * * * 08-22点的每个小时运行 00 08-22/3 * * * 08-22点的每3个小时运行 |
, | 表示独立时间(没规律) | 00 08,11,20 * * * 08,11,20点的时候运行 |
* | 每,全部/所有 | * 在分钟的位置上表示00-59 每分钟的意思 * 在小时的位置上表示00-23 每小时的意思 |
#每天的上午7点到晚上11点 每二个小时运行CMD命令
00 07-23/2 * * * CMD
#定时任务每天23点到第2天的7点运行.
00 23,00-07 * * * CMD
五、定时任务案例
1.每2分钟同步下系统的时间 必会
#写配置文件
[root@lnh ~]# crontab -e
#1.同步时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
#测试
[root@lnh ~]# date -s '20220101'
Sat Jan 1 00:00:00 CST 2022
[root@lnh ~]# date
Sat Jan 1 00:01:09 CST 2022
[root@lnh ~]# date
Sat Jan 1 00:02:06 CST 2022
[root@lnh ~]# date
Thu Dec 29 17:27:55 CST 2022
You have new mail in /var/spool/mail/root
日志:查看这个定时任务是否运行
[root@lnh ~]# tail -f /var/log/cron Jan 1 00:01:07 lnh crontab[6681]: (root) REPLACE (root) Jan 1 00:01:07 lnh crontab[6681]: (root) END EDIT (root) Jan 1 00:02:01 lnh crond[1093]: (root) RELOAD (/var/spool/cron/root) Jan 1 00:02:01 lnh CROND[6700]: (root) CMD (/sbin/ntpdate ntp1.aliyun.com) Dec 29 17:28:01 lnh CROND[6711]: (root) CMD (/sbin/ntpdate ntp1.aliyun.com)
查看输出
[root@lnh ~]# cat /var/spool/mail/root Date: Thu, 29 Dec 2022 17:32:07 +0800 (CST) 29 Dec 17:32:07 ntpdate[6730]: adjust time server 120.25.115.20 offset 0.000055 sec
2.每天定时备份/etc/ 到/backup/下面
备份时间:业务低谷期
- 命令:tar命令
- 脚本:命令大礼包 .sh结尾
- 定时任务配置:每分钟运行
- 调式完成改为要求的时间
#命令
[root@lnh ~]# mkdir -p /backup/
[root@lnh ~]# tar zcf /backup/etc-`date +%F`.tar.gz /etc/
#脚本
#创建脚本目录
[root@lnh ~]# mkdir -p /servers/scripts
#书写脚本
[root@lnh scripts]# cat backup-etc.sh.bak
tar zcf /backup/etc-`date +%F`.tar.gz /etc/
#执行脚本
[root@lnh scripts]# sh backup-etc.sh
#修改定时任务
[root@lnh scripts]# crontab -l
#1.同步时间
#*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
#2. 备份etc目录
* * * * * sh /servers/scripts/backup-etc.sh
3.脚本与变量
概述:在脚本中需要重复使用的内容(时间,ip地址..........),我们最好把这些内容存放到变量中,咋脚本中重复使用
#变量命令
#向变量赋值
#取值
[root@lnh ~]# time=`date +%F_%T`
[root@lnh ~]# echo $time
2022-12-29_14:57:23
[root@lnh ~]# echo $time
2022-12-29_14:57:23
[root@lnh ~]# time=`date +%F_%T`
[root@lnh ~]# echo $time
2022-12-29_14:57:27
变量命令规则:
不能以数字开头
如果要用是特殊符号,最好使用_
变量名字能够体现出变量作用
应用
[root@lnh scripts]# cat backup-etc.sh
#1.定义变量
backup_dir=/backup
time=`date +%F_%w`
#2.备份
tar zcf ${backup_dir}/etc-${time}.tar.gz /etc/
FAQ:
分时日月周,在取第几周的时候,会不会于日互相冲突,日不符合周 会不会乱
不推荐:周几与日期一起写.
定时任务失败排障法:
没有日志(crond服务没有运行,rsyslog服务没有运行)
没有结果(手动运行对应的命令或脚本)
调试脚本(sh -x 或bash -x 显示脚本的执行过程,有+的表示过程,没有+的表示输出)
六、定时任务注意事项(箴言)
1.增加注释
书写定时任务的时候,尽量添加上一个注释,用于说明这条定时任务的作用
2.尽量使用脚本
定时任务未来避免一些故障,推荐使用脚本
调试脚本的方法:
sh -x 或bash -x,显示脚本的执行过程
有+开头的表示脚本背后的执行过程
没有+开头的表示输出
[root@lnh scripts]# cat backup-etc.sh #!/etc/bash #desc: 备份脚本 加上ip地址 #1.定义变量 ip=`hostname -I |awk '{print $1}'` backup_dir=/backup/${ip} time=`date +%F_%w` #2.备份 mkdir -p ${backup_dir} tar zcf ${backup_dir}/etc-${time}.tar.gz /etc/ [root@lnh scripts]# sh -x backup-etc.sh ++ hostname -I ++ awk '{print $1}' + ip=10.0.0.200 + backup_dir=/backup/10.0.0.200 ++ date +%F_%w + time=2023-01-02_1 + mkdir -p /backup/10.0.0.200 + tar zcf /backup/10.0.0.200/etc-2023-01-02_1.tar.gz /etc/ tar: Removing leading `/' from member names
3.定时任务的文件,脚本使用绝对路径
书写定时任务的时候,相关文件要使用绝对路径
[root@lnh scripts]# crontab -l
#1.同步时间
#*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
#2.备份etc目录
#* * * * * sh /servers/scripts/backup-etc.sh &>/dev/null
#3.查看ip
#* * * * * sh /servers/scripts/ip.sh &>>/tmp/ip.log
4.命令使用绝对路径
定时任务中直接写命令,可以加上绝对路径
定时任务中运行,脚本开头可以重新设置PATH变量
5.定时任务中执行的命令或脚本定向到空或者追加到文件
[root@lnh scripts]# crontab -l
#1.同步时间
#*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
#2.备份etc目录
#* * * * * sh /servers/scripts/backup-etc.sh &>/dev/null #定向到空
#3.查看ip
#* * * * * sh /servers/scripts/ip.sh &>>/tmp/ip.log #追加到文件
七、定时任务故障案例
1.定时任务直接书写的时候%有特殊的含义
% 回车
去掉特殊含义,使用\
2.定时任务关于命令路径的故障
故障案例:
现象:命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到
原因:定时任务运行脚本的时候或命令的时候,只能识别到/bin 或/usr/bin目录下面的命令,其他命令无法识别
解决方案:
- 遇到不识别的命令,直接写绝对路径
- 在脚本开头,重新定义下PATH环境变量或重新加载下PATH环境变量
定时任务识别的命令的路径:
PATH linux环境变量,存放命令的位置.
linux会在PATH路径中查找,如果有则执行.如果没有提示command not found/ no such file or directory
#使用第一种方法
[root@lnh scripts]# cat ip.sh
#!/bin/bash
/usr/sbin/ifconfig eth0
/usr/sbin/ip a s eth0
#使用第二种方法
[root@lnh scripts]# cat ip.sh
#!/bin/bash
#source /etc/profile #重新加载PATH环境变量
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
#重新定义PATH环境变量
ifconfig eth0
ip a s eth0
3.定时任务没有定向到空或追加到文件故障案例
现象:
邮件服务开启:不断受到邮件 You have new mail in /var/spool/mail/root
邮件服务关闭:一些邮件的临时目录不断堆积小文件 /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件发送给root
解决:
定时任务中命令或脚本定向到空或追加到文件
八、使用案例
1. 定时备份/etc/目录到/backup以ip地址命名的目录中
[root@lnh scripts]# cat backup-etc.sh
#!/etc/bash
#desc: 备份脚本 加上ip地址
#1.定义变量
ip=`hostname -I |awk '{print $1}'`
backup_dir=/backup/${ip}
time=`date +%F_%w`
#2.备份
mkdir -p ${backup_dir}
tar zcf ${backup_dir}/etc-${time}.tar.gz /etc/
2. 定时系统巡检(定时输出系统基本信息)写入到/tmp/sys.log中
主机名信息(主机名)
ip地址
负载信息(0 0 0)
内存信息(内存多大,用了多少,剩余多少)
cpu信息(核心数)
磁盘信息(磁盘使用多少,剩余多少)
进程信息(一共多少进程,几个运行,几个挂起,几个僵尸)
#################################
主机名: oldboyedu ip地址: 10.0.0.200
#################################
负载信息
最近1分钟: 0
最近5分钟: 0
最近15分钟: 0
#################################
内存信息(单位kb)
总计内存: 2000000
内存使用了多少: 200000
内存使用率: 10%
#################################
swap信息
swap总大小: 200000
swap使用大小: 0
swap使用率: 0
#################################
磁盘信息
几块硬盘: 1
根分区大小: 20G
根分区使用率: 10%
################################
进程信息
进程总数: 100
运行中进程: 2
挂起进程数量: 0
僵尸进程数量: 0
################################
[root@lnh scripts]# cat sys-info.sh
#!/bin/bash
#作者:wh
#说明:系统巡检脚本
#版本:v1
#1.基础信息
hostname=`hostname`
ip=`hostname -I`
echo "===================================="
echo "基本信息:"
echo "主机名: ${hostname}"
echo "ip地址: ${ip}"
echo "===================================="
#2.负载
load1=`uptime |awk -F '[ ,]+' '{print $(NF-2)}'`
load5=`uptime |awk -F '[ ,]+' '{print $(NF-1)}'`
load15=`uptime |awk -F '[ ,]+' '{print $NF}'`
echo "===================================="
echo "负载信息:"
echo "最近1 分钟负载: ${load1}"
echo "最近5 分钟负载: ${load5}"
echo "最近15分钟负载: ${load15}"
echo "===================================="
#3.内存
mem_total=`free -m |awk 'NR==2{print $2}'`
mem_used=`free -m |awk 'NR==2{print $3+$6}'`
mem_used_percent=`free -m |awk 'NR==2{print ($3+$6)/$2*100"%"}'`
echo "===================================="
echo "内存信息:"
echo "总计内存: ${mem_total}M"
echo "使用内存: ${mem_used}M"
echo "内存使用率: ${mem_used_percent}"
echo "===================================="
#4.swap
swap_total=`free -m |awk 'NR==3{print $2}'`
swap_used=`free -m |awk 'NR==3{print $3+$6}'`
swap_used_percent=`free -m |awk 'NR==3{print ($3+$6)/$2*100"%"}'`
echo "===================================="
echo "swap信息:"
echo "总计swap: ${swap_total}M"
echo "使用swap: ${swap_used}M"
echo "swap使用率: ${swap_used_percent}"
echo "===================================="
#5.磁盘信息
disk_total=`fdisk -l 2>/dev/null |grep '/dev/sd[a-z][::]'|wc -l`
root_size=`df -h|awk '$NF=="/"{print $2}'`
root_used_percent=`df -h|awk '$NF=="/"{print $5}'`
echo "===================================="
echo "磁盘信息:"
echo "几块磁盘: ${disk_total}块"
echo "根分区大小: ${root_size}"
echo "根分区使用率: ${root_used_percent}"
echo "===================================="
#6.进程信息
proc_total=`top -bn1 |awk 'NR==2{print $2}'`
proc_running=`top -bn1 |awk 'NR==2{print $4}'`
proc_stopped=`top -bn1 |awk 'NR==2{print $8}'`
proc_zombie=`top -bn1 |awk 'NR==2{print $10}'`
echo "===================================="
echo "进程信息:"
echo "进程总数:${proc_total}"
echo "运行的进程: ${proc_running}"
echo "挂起的进程: ${proc_stopped}"
echo "僵尸进程: ${proc_zombie}"
echo "===================================="
[root@lnh scripts]# sh sys-info.sh
====================================
基本信息:
主机名: lnh
ip地址: 10.0.0.200
====================================
====================================
负载信息:
最近1 分钟负载: 0.00
最近5 分钟负载: 0.01
最近15分钟负载: 0.05
====================================
====================================
内存信息:
总计内存: 1980M
使用内存: 382M
内存使用率: 19.2929%
====================================
====================================
swap信息:
总计swap: 2047M
使用swap: 0M
swap使用率: 0%
====================================
====================================
磁盘信息:
几块磁盘: 1块
根分区大小: 47G
根分区使用率: 6%
====================================
====================================
进程信息:
进程总数:104
运行的进程: 2
挂起的进程: 0
僵尸进程: 0
====================================
3.发送邮件
配置发件人:163
获取:授权码
linux配置/etc/mail.rc
[root@lnh ~]# vim /etc/mail.rc #写到最后
#未加密的发送方式通过25端口,会被公有云封掉
cat >>/etc/mail.rc <<EOF
set from=163邮箱
set smtp=smtp.163.com
set smtp-auth-user=163邮箱
set smtp-auth-password=163授权码
set smtp-auth=login
EOF
#加密的方式通过465端口
cat >>/etc/mail.rc <<EOF
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
set from=163邮箱 #配置发件人
set smtp=smtps://smtp.163.com:465
#配置使用163发送邮件 如果是加密smtps://smtp.163.com:465
set smtp-auth-user=163邮箱 #用户名:邮箱名字
set smtp-auth-password=163授权码
set smtp-auth=login #认证形式login
EOF
配置加密方式发送邮件错误: Error in certificate: Peer's certificate issuer is not recognized
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /etc/pki/nssdb/163.crt certutil -A -n "GeoTrust SSL CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crt certutil -A -n "GeoTrust Global CA" -t "C,," -d /etc/pki/nssdb/ -i /etc/pki/nssdb/163.crt certutil -L -d /etc/pki/nssdb/ cd /etc/pki/nssdb/ certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt
#发送邮件
cat /backup/result.log |mail -s "今日巡检的结果" qq邮箱
mail -s '今日巡检的结果' qq邮箱 </backup/result.log
#发送邮件带上附件
echo "巡检信息在附件" |mail -s "巡检结果" -a /backup/result.log qq邮箱
#注:邮箱要写在最后
#写入定时任务脚本
sh /server/scripts/send-mail.sh
调用执行sh /server/scripts/sys-info.sh 脚本
上面脚本的结果写入到/backup/result.log文件中
通过mail命令把result.log发送给对应的用户
#写入定时任务
* * * * * sh /server/scripts/send-mail.sh &>/dev/null
4.生成表格
csv用逗号分隔脚本
[root@lnh scripts]# cat sys-info-csv.sh
#!/bin/bash
#作者:wh
#说明:系统巡检脚本
#版本:v1
#1.基础信息
hostname=`hostname`
ip=`hostname -I`
echo "基本信息,"
echo "主机名, ${hostname}"
echo "ip地址, ${ip}"
#2.负载
load1=`uptime |awk -F '[ ,]+' '{print $(NF-2)}'`
load5=`uptime |awk -F '[ ,]+' '{print $(NF-1)}'`
load15=`uptime |awk -F '[ ,]+' '{print $NF}'`
echo "负载信息,"
echo "最近1 分钟负载, ${load1}"
echo "最近5 分钟负载, ${load5}"
echo "最近15分钟负载, ${load15}"
#3.内存
mem_total=`free -m |awk 'NR==2{print $2}'`
mem_used=`free -m |awk 'NR==2{print $3+$6}'`
mem_used_percent=`free -m |awk 'NR==2{print ($3+$6)/$2*100"%"}'`
echo "内存信息,"
echo "总计内存, ${mem_total}M"
echo "使用内存, ${mem_used}M"
echo "内存使用率, ${mem_used_percent}"
#4.swap
swap_total=`free -m |awk 'NR==3{print $2}'`
swap_used=`free -m |awk 'NR==3{print $3+$6}'`
swap_used_percent=`free -m |awk 'NR==3{print ($3+$6)/$2*100"%"}'`
echo "swap信息,"
echo "总计swap, ${swap_total}M"
echo "使用swap, ${swap_used}M"
echo "swap使用率, ${swap_used_percent}"
#5.磁盘信息
disk_total=`fdisk -l 2>/dev/null |grep '/dev/sd[a-z][::]'|wc -l`
root_size=`df -h|awk '$NF=="/"{print $2}'`
root_used_percent=`df -h|awk '$NF=="/"{print $5}'`
echo "磁盘信息,"
echo "几块磁盘, ${disk_total}块"
echo "根分区大小, ${root_size}"
echo "根分区使用率, ${root_used_percent}"
#6.进程信息
proc_total=`top -bn1 |awk 'NR==2{print $2}'`
proc_running=`top -bn1 |awk 'NR==2{print $4}'`
proc_stopped=`top -bn1 |awk 'NR==2{print $8}'`
proc_zombie=`top -bn1 |awk 'NR==2{print $10}'`
echo "进程信息,"
echo "进程总数:${proc_total}"
echo "运行的进程, ${proc_running}"
echo "挂起的进程, ${proc_stopped}"
echo "僵尸进程, ${proc_zombie}"
[root@lnh scripts]# sh sys-info-csv.sh
基本信息,
主机名, lnh
ip地址, 10.0.0.200
负载信息,
最近1 分钟负载, 0.06
最近5 分钟负载, 0.04
最近15分钟负载, 0.05
内存信息,
总计内存, 1980M
使用内存, 384M
内存使用率, 19.3939%
swap信息,
总计swap, 2047M
使用swap, 0M
swap使用率, 0%
磁盘信息,
几块磁盘, 1块
根分区大小, 47G
根分区使用率, 6%
进程信息,
进程总数:106
运行的进程, 1
挂起的进程, 0
僵尸进程, 0
linux文件转到windows,使用execl打开乱码处理方法
iconv -f utf8 -t gbk result.csv >result-windows.csv
result.csv 是linux生成的
result-windows.csv 是windows office可以打开的
[root@lnh scripts]# iconv -f utf8 -t gbk sys-info.csv >sys-info-windows.csv
[root@lnh scripts]# sz sys-info-windows.csv