云计算 SRE 运维 —— 第四周
- 自定义写出 10个 定时任务的示例,要求尽量的覆盖各种场景:比如每周三凌晨三点执行 date 命令
- 图文并茂说明 Linux 进程和内存概念
- 图文并茂说明 Linux 启动流程
- 自定义一个 Systemd 服务定时去其他服务器上检查 /tmp/ 下文件的个数,如果发现数量有变化就记录变化情况到文件中
- 编写 Linux 内核编译安装博客
- 总结 5 个自我觉得比较有用的 awk 的使用场景,比如在什么情况下用 awk 处理文本效率最高
定时任务示例
# 每周三凌晨三点执行 date 命令
* 3 * * 3 date
# 每天的 6-12 点之间每隔 2 小时执行 /app/bin/test.sh
* 6-12/2 * * * /app/bin/test.sh
# 每周五凌晨 2 点执行数据库备份脚本
* 2 * * 5 /data/mysql/backup.sh
# 每个月第一天凌晨 4 点重启 HTTPD 服务
* 4 1 * * systemctl restart httpd
# 工作日每 4 个小时执行一次打包日志文件
* */4 * * 1-5 tar cvf /tmp/log.tar.gz /var/log/*
......
Linux 进程与内存
进程
进程(Process):执行中的程序
- 在 Linux 中,进程可以理解为程序的一次动态执行过程,占用特定的内存空间一个进程体现为 /proc 下的一个目录,每个进程独立运行
- 进程由程序、数据和进程控制块三部分组成
- 每个进程都有一个 PID 号,对应 /proc 目录下的每个数字

进程状态:一个进程从创建到终止一般会经历五个状态:
- 创建状态:进程在创建时需要申请一个空白PCB(进程控制块),向其中填写控制和管理进程的信息,完成资源分配
- 就绪状态:进程已经准备好,已分配到所需资源,只要分配到CPU就能够立即运行
- 执行状态:进程处于就绪状态被调度后,进程进入执行状态
- 阻塞状态(暂停状态):正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
- 终止状态:进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行

线程
线程(Thread):进程划分成的更小的运行单位,是操作系统能够进行运算调度的最小单位
- 同一进程下的各个线程之间共享程序的内存空间(包括 CPU、Date 等)
- 同一进程下的各个线程之间共享进程资源(如打开文件和信号)
内存
一般来说,一个程序或者服务在运行的时候,会生成一个或者多个进程,而进程就是运行在内存中的
Linux 中内存分为物理内存和虚拟内存:
- 物理内存:物理内存条而获得的内存空间
- 虚拟内存:“使用硬盘空间来扩展内存”,通过虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间;虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)
进程使用内存问题:
- 内存泄漏(Memory Leak):动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元
- 内存溢出(Memory Overflow):指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存
- 内存不足(Out Of Memory)
Linux 启动流程
Linux 系统启动流程大致可分为五个阶段:
- 内核引导
- 运行 init
- 系统初始化
- 建立终端
- 用户登录系统
CentOS 7
CentOS 7 系统 init 程序类型:systemd
配置文件:/usr/lib/systemd/system、 /etc/systemd/system

- 开机加电自检:检查 bios 中识别的硬件信息是否正常
- 开机 MBR 引导:/boot 分区引导系统启动的记录信息(MBR 引导记录--系统启动文件信息/分区表信息)
- grup 选择菜单:可以选择系统内核信息/可以选择进入单用户模式
- 加载内核信息:用于管理控制硬件
- 启动系统进程:/usr/lib/systemd/systemd --- 后续进程启动(并型)
- 加载启动 targe t文件:/etc/systemd/system/default.target --- 选择不同级别启动系统
- 加载系统初始化文件:/usr/lib/systemd/system/sysinit.target --- 设置主机名称,设置网卡地址信息
- 执行服务运行脚本:/etc/systemd/system 实现服务开机自动运行,/usr/lib/systemd/system/ 保存系统中所有程序启动文件
- 启动 mingetty 进程:显示登录提示信息
总结:开机自检 --- 加载 MBR --- 加载 grup 菜单 --- 加载内核 --- 启动第一个服务进程 --- 加载运行 target 信息--- 加载初始化脚本 --- 加载运行文件(实现服务程序开机自启)--- 启动 mingetty 进程显示登录界面
CentOS 6
CentOS 6 系统 init 程序类型:init
配置文件:/etc/inittab, /etc/init/ *.conf

- 第一步:开机自检,加载 BIOS
- 第二步:读取 MBR
- 第三步:Boot Loader grub 引导菜单
- 第四步:加载 kernel 内核
- 第五步:init 进程依据 inittab 文件夹来设定运行级别
- 第六步:init 进程执行 rc.sysinit
- 第七步:启动内核模块
- 第八步:执行不同运行级别的脚本程序
- 第九步:执行 /etc/rc.d/rc.local
自定义 Systemd 服务
准备脚本文件
[root@master01 ~]# vim /data/diff_tmp.sh
#!/bin/bash
# **********************************************************
#
# * Author : C-FikT
# * Email : chenunified@163.com
# * Create time : 2022-11-24 04:40
# * Filename : test.sh
# * Description :
#
# **********************************************************
# 自定义检查间隔
TIME="600"
# 自定义检查路径
DIR=/tmp
CMD1=`ls -l ${DIR} | grep -E '^-' | wc -l && sleep ${TIME}`
CMD2=`ls -l ${DIR} | grep -E '^-' | wc -l`
NUM1=`echo ${CMD2}-${CMD1} | bc`
NUM2=`echo ${CMD1}-${CMD2} | bc`
DATE=`date +%F-%T`
function diff_tmp {
if [ ${CMD1} -gt ${CMD2} ]; then
echo "${DATE} - ${DIR} 文件数量:${CMD2},减少了 ${NUM2}" >> /tmp/diff.log
elif [ ${CMD1} -lt ${CMD2} ]; then
echo "${DATE} - ${DIR} 文件数量:${CMD2},新增了 ${NUM1}" >> /tmp/diff.log
else
echo "${DATE} - ${DIR} 文件数量:${CMD2},无变化" >> /tmp/diff.log
fi
}
diff_tmp
准备 service 文件
[root@master01 ~]# vim /lib/systemd/system/diff.service
[Unit]
Description=diff tmp
[Service]
ExecStart=/bin/sh /data/diff_tmp.sh
ExecStop=/bin/kill -s HUP $MAINPID
Restart=always
[Install]
Wantedby=multi-user.target
启动 service 服务,观察结果
# 重载 Service 文件
[root@master01 ~]# systemctl daemon-reload
# 启动 Service 服务
[root@master01 ~]# systemctl start diff
# 观察结果
[root@master01 ~]# tail -f /tmp/diff.log
2022-11-24-15:31:30 - /tmp 文件数量:13,无变化
2022-11-24-15:31:51 - /tmp 文件数量:13,无变化
2022-11-24-15:41:59 - /tmp 文件数量:18,新增了 1
2022-11-24-15:42:12 - /tmp 文件数量:17,减少了 1
2022-11-24-15:43:24 - /tmp 文件数量:14,减少了 3
升级内核版本
步骤
1)
添加第三方yum源进行下载安装
RHEL-9:yum install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
RHEL-8:yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
RHEL-7:yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
2)
进入/etc/yum.repos.d/目录下,发现有elrepo.repo文件,此文件就是内核源
elrepo.repo文件下,最新内核源默认禁用,需手动启用,将[elrepo-kernel]下的enabled的值改为1
3)
yum list kernel* 查看可安装内核
kernel-lt.x86_64:长期技术支持版
kernel-ml.x86_64:测试版
4)
安装内核
yum install -y kernel-lt.x86_64
5)
reboot重启
范例
# 添加第三方yum源进行下载安装
[root@linux ~]# yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
# 启动yum源,将[elrepo-kernel]下enabled=0修改为enabled=1
[root@linux ~]# vim /etc/yum.repos.delrepo.repo
enabled=1
# 查看可安装内核版本(选做)
[root@linux yum.repos.d]# yum list kernel*
# 安装内核
[root@linux yum.repos.d]# yum install -y kernel-lt.x86_64
# 重启
[root@linux ~]# reboot
# 查看内核版本
[root@linux ~]# uname -r
5.4.209-1.el8.elrepo.x86_64
awk 命令范例
统计 Nginx 客户端访问最多的 IP
1. awk '{print $1}' /apps/nginx/logs/nginx.access.log # 取第一列
2. sort # 排序
3. uniq -c # 显示每行重复出现的行数
4. sort -nr # 以数字降序排序
5. head -e # 取前三行
[root@master01 ~]# awk '{print $1}' /apps/nginx/logs/nginx.access.log | sort | uniq -c | sort -nr | head -3
取分区利用率最高的三位
1. awk -F " +|%" '{print $5}' # 以一个、多个空格或百分号为分隔符,取第5列
2. tail -n +2 # 从第2行开始到结束
[root@master01 ~]# df | awk -F " +|%" '{print $5}' | tail -n +2
计算文件内数字的总和
[root@master01 ~]# awk '{sum=0;for(i=1;i<=NF;i++){sum+=i}{print sum}}' sum.txt
awk 去重
[root@master01 ~]# awk '!line[$0]++' awk.txt
查看 Linux 系统每个 IP 的连接数
[root@master01 ~]# netstat -n | awk '/^tcp/{print $5}' | awk -F ":" '{print $1}' | sort | uniq -c | sort -nr

浙公网安备 33010602011771号