@TOC
1.服务使用流程
服务使用流程 | 说明 |
---|---|
部署 | 安装这个服务或软件 |
配置 | 如何使用这个服务通过配置文件,通过命令。初级使用:能用就行。提高:额外配置。 |
优化或注意事项 | 安全...... |
排障 | 难点 :one:学会通过错误提示解决问题 :two:学会看日志 :three:高级:让服务输出错误提示或者输出更加详细的错误提示(通过重定向) |
其他 | :one:做好监控 :two:做好备份 :three:做好日志收集 :four:统一认证 |
2.部署定时任务
2.1.定时任务软件包名字:cronie , 服务名字(进程)crond
rpm -qa cronie
rpm -qi cronie
rpm -ql cronie
2.2.目录结构及说明
目录结构 | 说明 |
---|---|
:one:/var/spool/cron/ | 用户的定时任务的配置文件的目录 |
:two:crontab | 定时任务管理的命令 |
:three:/var/log/cron | 定时任务日志‘ |
了解就行的配置文件 | |
/etc/crontab | 不推荐使用这个,系统定时任务的配置文件 |
/etc/cron.hourly/ | 系统定时任务,每小时运行 |
/etc/cron.daily/ | 系统定时任务,每天运行 |
/etc/cron.weekly/ | 系统定时任务,每周运行 |
/etc/cron.monthly/ | 系统定时任务,每个月运行 |
2.3.检查是否运行
2.4.使用指南
2.4.1.配置的命令
- crontab用于对定时任务的规则进行增删改查.
crontab选项 | 说明 | |
---|---|---|
crontab -e | edit编辑当前用户的定时任务 | vi /var/spool/cron/root #root当前用户的名字 |
crontab -l | list查看当前用户的定时任务 | cat /var/spool/cron/root #root当前用户的名字 |
[08:45:41 root@centos7 data]# crontab -l
no crontab for root
用户未设定定时任务
[08:47:51 root@centos7 data]# crontab -e
no crontab for root - using an empty one
#用户未设置定时任务 给你创建空的
#1. crond test by dange
"/tmp/crontab.vqDK9C" 1L, 24C written
crontab: installing new crontab
# 更新了定时任务的配置。
2.4.2.定时任务书写格式-时间 *
# 每天早上8:30分 去学校(go to school)
# 1.test01
30 08 * * * go to school
# 晚上12点上床睡觉(go to bed/sleep) dbj
# 2.test02
* 00 * * * go to bed #每天的半夜12点00-59每分钟运行.
00 00 * * * go to bed #每天运行
问题:
表示整点的时候,未说明分钟的时候,我们要指定的分钟,一般是00.
关于分钟位置上是否写*说明
涉及到小时,天,周几的时候,分钟位置上记得写个数(00)
每周六半夜12点带cc去dbj
* 00 * * 06 dbj
* 每周的半夜12点00-59,每分钟都大保健1次 (分钟1次)
0-59
00 00 * * 06 dbj 每周六的半夜12点去dbj
2.4.3.定时任务时间部分的特殊符号 *
时间部分特殊符号 | 说明 | 案例 |
---|---|---|
/ | 每隔xxx时间 | /2 每2分钟 00 /2 * 每2小时 |
- | 表示范围 | 00 08-22 * 08-22点的每个小时运行 |
, | 表示独立时间(没规律) | 00 08,11,14,17,20 * |
* | 每,全部/所有(没说具体时间) | 在分钟的位置上表示00-59,每分钟的意思 在小时位置上表示00-23,每小时的意思 |
每天的上午7点到晚上11点 每二个小时运行CMD命令
00 07-23/2 * * * CMD
07 09 11 13 15 17 19 21 23
定时任务每天23点到第2天的7点运行.
00 23,00-07 * * *
3.定时任务案例
- 同步时间
- 进行备份
- 日常循环操作
- 巡检+发送邮件
3.1.案例01: 每2分钟同步下系统的时间
#1. 同步时间,每2分钟同步一次时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
tail -f /var/log/cron
3.2.案例02: 每天定时备份/etc/到/backup/下面:star::star::star::star::star:
3.2.1.命令
mkdir -p /backup/
tar -czf /backup/etc-`date +%F_%W`.tar.gz /etc/
3.2.2.脚本
# 专用脚本目录
mkdir -p /server/scripts/devops-shell
# 书写脚本
[15:02:36 root@centos7 devops-shell]# cat backup-etc.sh
#!/bin/bash
if [ ! -d /backup/ ];then
mkdir -p /backup/
fi
tar -czf /backup/etc-`date +%F_%T`.tar.gz /etc/
3.2.3.定时任务-时间每分钟或每2分钟(调试)
#3.backup etc by dange 2024-10-23
* * * * * sh /server/scripts/devops-shell/backup-etc.sh
3.2.4. 检查日志和结果
watch ls -l
3.2.5.定时任务-调试完成后改为指定的时间运行
#2. 定时备份 /etc/ 目录
00 00 * * * sh /server/scripts/devops-shell/backup-etc.sh
4.定时任务注意事项(箴言)
- 命令使用绝对路径.
- 书写的命令或脚本定向到空或追加到文件.
4.1.定时任务书写流程
- :one:分析要求需要使用什么命令并调试
- :two:书写脚本(命令较多,功能复杂)与调试
- :three:书写定时任务的配置文件(绝对路径,定向到空)
- :four:调试
4.2.增加注释
- 书写定时任务的时候,尽量添加上一个注释.
- 用于说明这条定时任务作用.
4.3.尽量使用脚本
- 定时任务未来避免一些故障,推荐使用脚本.
调试脚本的方法:
sh -x 或bash -x ,显示脚本执行过程.
有+开头的表示脚本背后执行的过程.
如果开头没有+,表示输出.
4.4.定时任务的文件,脚本使用绝对路径
/server/scripts/backup-etc.sh
4.5.命令使用绝对路径
- 定时任务中直接写命令,可以加上绝对路径
- 定时任务中运行脚本,脚本开头可以重新设置PATH环境变量
4.6.定时任务中执行的命令或脚本定向到空或追加到文件
# 定向到空
#1.同步时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
# 追加到文件
#2.echo
* * * * * echo hello >>/tmp/hello.txt 2>&1
#3.定时备份 /etc/ 目录
00 01 * * * /bin/bash -x /server/scripts/backup-etc.sh >>/tmp/scripts.log 2>&1
5.定时任务故障案例
5.1.定时任务直接书写的时候%有特殊含义
- %回车.
- 去掉特殊含义需要使用\
如果使用脚本,就没有这个问题了
5.2.定时任务关于命令路径的故障
- 在定时任务运行命令或脚本的时候,只能识别到/bin或/usr/bin目录下面的命令.
- 只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH环境变量.
5.2.1.故障案例
故障案例:
- 现象: 命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到.
- 原因: 定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令.其他的命令无法识别.
解决方案:
- 🅰 简单粗暴,遇到这种命令,直接写绝对路径.
- 🅱 治本,在脚本开头 重新定义下PATH环境变量或重新加载下PATH环境变量.
- 定时任务识别的命令的路径:
- PATH linux环境变量,存放命令的位置.
- linux会在PATH路径中查找,如果有则执行.如果没有提示command not found/ no such file or directory
5.2.2.使用解决方案🅰
5.2.3.使用解决方案🅱 重新定义PATH
5.2.4.使用解决方案🅱 重新加载PATH变量
5.2.5.故障实例
5.3.定时任务没有定向到空或追加到文件故障案例
现象:
- 邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
- 邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
- 定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.
解决:
- 定时任务中命令或脚本定向到空或追加到文件.
# 定向到空
#1.同步时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
# 追加到文件
#2.echo
* * * * * echo hello >>/tmp/hello.txt 2>&1
#3.定时备份 /etc/ 目录
00 01 * * * /bin/bash -x /server/scripts/backup-etc.sh >>/tmp/scripts.log 2>&1
6.定时任务使用案例
6.1.定时备份/etc/目录到/backup以ip地址命名的目录中
书写脚本+变量
- 取出ip存放变量 ✅
- 取出时间存放到变量 ✅
- 创建以ip命名目录 ✅
- 打包压缩存放到这个ip地址命名的目录中,压缩包加上时间 ✅
- 书写定时任务(每分钟)
- 书写定时任务(改为指定时间)
6.2.定时系统巡检(定时输出系统基本信息)写入到/tmp/sys.log中
- 通过手动或自动方式,获取所有主机的基本信息.
- 未来这个操作可以通过监控实现.
主机名信息(主机名)
ip地址
负载信息(0 0 0)
内存信息(内存多大,用了多少,剩余多少)
cpu信息(核心数)
磁盘信息(磁盘使用多少,剩余多少)
进程信息(一共多少进程,几个运行,几个挂起,几个僵尸)
- 写入到/tmp/sys.log文件的格式
#################################
主机名: 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
################################
[12:43:53 root@centos7 devops-shell]# cat sys_info_85_day26_v1.sh
#!/bin/bash
#
#**********************************************************
#Author: dange
#QQ 123456
#Date: 2024-10-24
#FileName: sys_info_85_day26.sh
#Version: V1.0
#URL: www.baidu.com
#Description: 系统巡检脚本
#Copyright (C): 2024 All rights reserved
#*********************************************************
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
#1.输出基本信息
hostname=`hostname`
ip=`hostname -I | awk '{print $1}'`
echo "#############################################"
echo "主机名:${hostname} 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 "系统负载信息"
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}'`
mem_used_percent=`free -m | awk 'NR==2{print $3/$2*100"%"}'`
echo "###############内存信息(单位MB)##############"
echo "总计内存:${mem_total}MB"
echo "已用内存:${mem_used}MB"
echo "内存使用率:${mem_used_percent}"
#4.swap信息
swap_total=`free -m | awk 'NR==3{print $2}'`
swap_used=`free -m | awk 'NR==3{print $3}'`
swap_used_percent=`free -m | awk 'NR==3{print $3/$2*100"%"}'`
echo "###############内存swap信息##################"
echo "swap总大小:${swap_total}MB"
echo "swap使用大小:${swap_used}"
echo "swap使用率:${swap_used_percent}"
#5.磁盘信息
disk_count=`fdisk -l 2>/dev/null| grep '/dev/sd[a-z]:' | wc -l`
root_total_size=`df -h | awk '$NF=="/"{print $2}'`
root_used_percent=`df -h | awk '$NF=="/"{print $5}'`
echo "##################磁盘信息####################"
echo "硬盘数量:${disk_count}"
echo "根分区大小:${root_total_size}"
echo "根分区使用率:${root_used_percent}"
#6.进程信息
proc_total=`top -b -n1 | awk 'NR==2{print $2}'`
proc_running=`top -b -n1 | awk 'NR==2{print $4}'`
proc_stopped=`top -b -n1 | awk 'NR==2{print $(NF-3)}'`
proc_zombine=`top -b -n1 | awk 'NR==2{print $(NF-1)}'`
echo "##################进程信息####################"
echo "进程总数:${proc_total}"
echo "运行中的进程数:${proc_running}"
echo "挂起的进程数量:${proc_stopped}"
echo "僵尸进程数量:${proc_zombine}"
echo "#############################################"
6.3.发送邮件
6.3.1.配置发件人:163
6.3.2.获取:授权码(用户密码)
HRQPVKNACQMQOLYZ
6.3.3.linux配置/etc/mail.rc
- 不推荐
vim /etc/mail.rc #写到最后
#未加密的发送方式通过25端口,会被公有云封掉.
cat >>/etc/mail.rc <<EOF
set from=lidao996@163.com
set smtp=smtp.163.com
set smtp-auth-user=lidao996@163.com
set smtp-auth-password=BGRCTL CZXIT
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=lida996@163.com
set smtp=smtps://smtp.163.com:465
set smtp-auth-user=lido996@163.com
set smtp-auth-password=aaaa
set smtp-auth=login
EOF
- 详解
set from=lidao996@163.com #配置发件人
set smtp=smtp.163.com #配置使用163发送邮件 如果是加密smtps://smtp.163.com:465
set smtp-auth-user=lidao996@163.com #用户名:邮箱名字
set smtp-auth-password=BGRCTLKQDU IT #授权码
set smtp-auth=login #认证形式login
#下面3行用于配置加密方式进行传输
set nss-config-dir=/etc/pki/nssdb/
set smtp-user-starttls
set ssl-verify=ignore
6.3.4.问题
配置加密方式发送邮件错误: Error in certificate: Peer's certificate issuer is not recognized
- 解决方法:在sys_info_85_day26_v1.sh 脚本后面加入
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 /etc/pki/nssdb/163.crt
6.3.5.发送邮件
cat /backup/result.log |mail -s "今日巡检的结果" youjiu_linux@qq.com
mail -s '巡检' youjiu_linux@qq.com
6.3.6.发送邮件带上附件
echo "巡检信息在附件" |mail -s "巡检结果" -a /backup/result.log youjiu_linux@qq.com
6.3.7.写入定时任务
脚本:
- 获取系统各种指标与信息 脚本
- 存放到文件 命令
- 把文件内容通过邮件发送走
脚本关系
sh /server/scripts/send-mail.sh
调用执行sh /server/scripts/sys-info.sh 脚本
上面脚本的结果写入到/backup/result.log文件中
通mail命令把result.log发送给对应的用户
6.3.8.测试定时任务
#6. 系统巡检并发送邮件
* * * * * sh /server/scripts/send-mail.sh &>/dev/null
6.4.表格
- csv表格:通过逗号分割的内容
[15:28:44 root@centos7 devops-shell]# cat sys_info_85_day26_v2_csv.sh
#!/bin/bash
#
#**********************************************************
#Author: dange
#QQ 123456
#Date: 2024-10-24
#FileName: sys_info_85_day26.sh
#Version: V1.0
#URL: www.baidu.com
#Description: 系统巡检脚本
#Copyright (C): 2024 All rights reserved
#*********************************************************
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
#1.输出基本信息
hostname=`hostname`
ip=`hostname -I | awk '{print $1}'`
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}'`
mem_used_percent=`free -m | awk 'NR==2{print $3/$2*100"%"}'`
echo "内存信息,"
echo "总计内存,${mem_total}MB"
echo "已用内存,${mem_used}MB"
echo "内存使用率,${mem_used_percent}"
#4.swap信息
swap_total=`free -m | awk 'NR==3{print $2}'`
swap_used=`free -m | awk 'NR==3{print $3}'`
swap_used_percent=`free -m | awk 'NR==3{print $3/$2*100"%"}'`
echo "swap信息,"
echo "swap总大小,${swap_total}MB"
echo "swap使用大小,${swap_used}"
echo "swap使用率,${swap_used_percent}"
#5.磁盘信息
disk_count=`fdisk -l 2>/dev/null| grep '/dev/sd[a-z]:' | wc -l`
root_total_size=`df -h | awk '$NF=="/"{print $2}'`
root_used_percent=`df -h | awk '$NF=="/"{print $5}'`
echo "磁盘信息,"
echo "硬盘数量,${disk_count}"
echo "根分区大小,${root_total_size}"
echo "根分区使用率,${root_used_percent}"
#6.进程信息
proc_total=`top -b -n1 | awk 'NR==2{print $2}'`
proc_running=`top -b -n1 | awk 'NR==2{print $4}'`
proc_stopped=`top -b -n1 | awk 'NR==2{print $(NF-3)}'`
proc_zombine=`top -b -n1 | awk 'NR==2{print $(NF-1)}'`
echo "进程信息,"
echo "进程总数,${proc_total}"
echo "运行中的进程数,${proc_running}"
echo "挂起的进程数量,${proc_stopped}"
echo "僵尸进程数量,${proc_zombine}"
bash sys_info_85_day26_v2_csv.sh >result-linux.txt
iconv -f utf8 -t gbk result-linux.txt -o result-linux.csv
评论