马哥SRE第四周课程作业

一. 自定义写出10个定时任务的示例:

要求尽量的覆盖各种场景
比如每周三凌晨三点执行date命令

#每周三凌晨三点执行date命令
0 3 * * 3 date
#在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup
0 6-12/3 * 12 * /usr/bin/backup
#周一到周五每天下午 5:00 寄一封信给 [email protected]
0 17 * * 1-5 mail -s "hi" [email protected] < /tmp/maildata
#每月1、10、22日的4 : 45重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#11月每天的6-12点之间每隔2小时执行/app/bin/test.sh
0 6-12/2 * 11 * /app/bin/test.sh
30 2 * * 1,3,5 xxxx 每个星期1、3、5
30 2 * * 1-5 xxxx 工作日
30 2 * * 0,6 xxxx 周末
*/10 2 1,10,20 * 0,6 ###默认是并且的关系,如果冲突就是或者关系 每个月的 1、10、20 或者周六日
#cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将当成作命令的标准输入,如果在命令中要使用%,则需要用 \ 转义
30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T`
#秒级别运行任务
#!/bin/bash
step=1  #间隔的秒数,不能大于60
for ((i=0;i<60;i=(i+step)));do
$(date>>/mnt/file)
sleep $step
done
exit 0
[root@xen mnt]# chmod +x test.sh
[root@xen mnt]# crontab -e

* * * * * sh /mnt/date.sh

在这里插入图片描述

第一题:0 0-22/2 2-31/2 2-12/2 * date
第二题:10 1 * 8 0,1 /tmp/test.sh
第三题:0 0 * * * tar -zcf /tmp/test.tar.gz /var/www/html/*
第四题:0 23 * * 6 systemctl restart smb
第五题:0,30 18-23 * * * systemctl restart httpd
第七题:45 4 1,10,22 * * date >> /tmp/zhenshui.txt
第八题:0 4 1 1 * systemctl restart httpd
第九题:0 11 4 * 1-3 reboot
第十题:0 5-23 * * * rm -rf /var/www/html/*
第十一题:20 3 * * 1-6 tar -zcf /tmp/shuai.tar.gz /etc
第十二题:30 3,12 * * * /tmp/hello.sh
第十三题:*/30 8-18/2 * * * date

二. 图文并茂说明Linux进程和内存概念

常见的优化思路有这么几种:
      1)最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。
      2)减少内存的动态分配。比如,可以使用内存池、大页(HugePage)等。
      3)尽量使用缓存和缓冲区来访问数据。比如,可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用Redis 这类的外部缓存组件,优化数据的访问。
      4)使用 cgroups 等方式限制进程的内存使用情况。这样,可以确保系统内存不会被异常进程耗尽。
      5)通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM杀死。

在这里插入图片描述
进程:将程序动态的运行起来,就转成进程,(即程序的执行过程)过程: 包含进程的创建,进程的运行以及进程消亡。
进程一般由程序、数据集合和进程控制块三部分组成。
进程一般包含两种,前台进程和后台进程。

内存:是运行进程的空间,CPU待处理的数据和运行的程序暂时存储的空间。
在这里插入图片描述

进程与线程的区别

线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;调度和切换:线程上下文切换比进程上下文切换要快得多。

pmap 33477 #内存OOM看哪个组件占的内存多
33477: ping 127.0.0.1
000055f708aa7000 56K r-x-- ping
000055f708cb5000 4K r---- ping
000055f708cb6000 4K rw— ping
000055f708cb7000 140K rw— [ anon ]
000055f70a7cc000 132K rw— [ anon ]
00007fe73fb13000 2528K r---- LC_COLLATE
00007fe73fd8b000 108K r-x-- libpthread-2.28.so
00007fe73fda6000 2044K ----- libpthread-2.28.so
00007fe73ffa5000 4K r---- libpthread-2.28.so
00007fe73ffa6000 4K rw— libpthread-2.28.so
00007fe73ffa7000 16K rw— [ anon ]
00007fe73ffab000 12K r-x-- libdl-2.28.so
00007fe73ffae000 2044K ----- libdl-2.28.so
00007fe7401ad000 4K r---- libdl-2.28.so
00007fe7401ae000 4K rw— libdl-2.28.so
00007fe7401af000 88K r-x-- libz.so.1.2.11
00007fe7401c5000 2044K ----- libz.so.1.2.11

三. 图文并茂说明Linux启动流程

在这里插入图片描述

启动加载器 bootloader
grub 功能和组成
bootloader: 引导加载器,引导程序
Windows: ntloader,仅是启动OS
Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装
载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
Linux的bootloader
LILO:LInux LOader,早期的bootloader,功能单一
GRUB: GRand Unified Bootloader, CentOS 5,6 GRUB 0.97: GRUB Legacy, CentOS 7 以后使
用GRUB 2.02
GRUB 启动阶段
primary boot loader :
1st stage:MBR的前446个字节(放不了文件系统的驱动,因为没进操作系统)
1.5 stage:MBR 之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
secondary boot loader :2nd stage,分区文件/boot/grub/
在这里插入图片描述

CentOS6启动流程

(1) 加载BIOS的硬件信息,获取第一个启动设备
(2) 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
(3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
(4) 核心执行init程序,并获取默认的运行信息
(5)init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统
(6)启动核心的外挂模块
(7)init执行运行的各个批处理文件(scripts)
(8) init执行/etc/rc.d/rc.local
(9)执行/bin/login程序,等待用户登录
(10)登录之后开始以Shell控制主机

系统初始化脚本功能(/etc/rc.d/rc.sysinit)
(1) 设置主机名
(2) 设置欢迎信息
(3) 激活udev和selinux
(4) 挂载/etc/fstab文件中定义的文件系统
(5) 检测根文件系统,并以读写方式重新挂载根文件系统
(6) 设置系统时钟
(7) 激活swap设备
(8) 根据/etc/sysctl.conf文件设置内核参数
(9) 激活lvm及software raid设备
(10)加载额外设备的驱动程序
(11)清理操作

CentOS7以后启动流程

(1) UEFi或BIOS初始化,运行POST开机自检
(2) 选择启动设备
(3) 引导装载程序, centos7是grub2,加载装载程序的配置文件:
  /etc/grub.d/
  /etc/default/grub
  /boot/grub2/grub.cfg
(4) 加载initramfs驱动模块
(5) 加载内核选项
(6)内核初始化,centos7使用systemd代替init
(7) 执行initrd.target所有单元,包括挂载/etc/fstab
(8) 从initramfs根文件系统切换到磁盘根目录
(9) systemd执行默认target配置,配置文件/etc/systemd/system/default.target
(10)systemd执行sysinit.target初始化系统及basic.target准备操作系统
(11) systemd启动multi-user.target下的本机与服务器服务
(12) systemd执行multi-user.target下的/etc/rc.d/rc.local
(13) Systemd执行multi-user.target下的getty.target及登录服务
(14)systemd执行graphical需要的服务

和运行级别对应关系(target=runlevel)
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target

四. 自定义一个systemd服务定时去其他服务器上检查/tmp/下文件的个数,如果发现数量有变化就记录变化情况到文件中。

vim /lib/systemd/system/find.service

[Unit]
Description=check tmp
[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c  "ssh [email protected]  sh /shell/check_tmp.sh"   #基于key验证
ExecStop=ps auxf | grep [check]_tmp.sh |awk '{print $2}' |xargs kill -9 2>/dev/null
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
Wantedby=multi-user.target


systemctl daemon-reload
systemctl enable --now find.service

五. 写Linux内核编译安装博客

#下载linux内核 https://www.kernel.org/
#将下载的内核包上传到linux
yum -y install gcc make ncurses-devel flex bison openssl-devel 
elfutils-libelf-devel bc perl
tar xf linux-5.18.9.tar.xz -C /usr/local/src
cd /usr/local/src/linux-5.18.9
cp /boot/config-$(uname -r) .config
vim .config
#修改下面三行
# CONFIG_MODULE_SIG=y #注释此行
CONFIG_SYSTEM_TRUSTED_KEYS="" #修改此行
# CONFIG_DEBUG_INFO_BTF=y     #更改内核版本名称make menuconfigGeneral setup  ➡️  Local version - append to kernel release ➡️ -m67-magedu ➡️ savemake -j 8    #多少核就写多少,此处很慢
make modules_install
make installreboot

在这里插入图片描述

六. 总结5个自我觉得比较有用的awk的使用场景,比如在什么情况下用awk处理文本效率最高,发散题,至少写1个。

#查询登录不成功的主机及次数
lastb |awk '{print $3}'|sort |uniq -c|sort -nr

#查看磁盘使用率
df | sed -rn '/^\/dev\/sd/ s#(\S+\s+){4}(.*)%.*#\2#p'
df | awk -F"[[:space:]]+|%" '$0 ~ /^\/dev/{if($5>70)print $1,$5}'

#连接数最多的前3个IP
ss -nt|awk -F: '{print $(NF-1)}' |awk '/^[0-9]/{print $NF}'| sort |uniq -c |head -n 3

#显示主机的连接状态出现的次数
awk 'NR!=1{print $1}' ss.log |sort |uniq -c

## 文件abc,txt只有一行数字,计算其总和
cat abc.txt
1 2 3 4 5
awk '{for(i=1;i<=NF;i++){sum+=i};print sum}' abc.txt
cat abc.txt|tr ' ' + |bc
sum=0;for i in `cat abc.txt`;do let sum+=$i;done;echo $sum
#每十分钟检查将连接数超过100个以上的IP放入黑名单拒绝访问
LINK=100
while true;do
 ss -nt | awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'|sort |uniq - c|while read count ip;do 
 if [ $count -gt $LINK ];then
   iptables -A INPUT -s $ip -j REJECT
 fi
 done
done
#数组
awk '!line[$0]++' awk_array.txt #去重,逐行对应每个值下标没赋值控制取反就是真就打印,当遇到重复的值下标不为0取反就0,不打印这行。
awk '{ip[$1]++}END{for(i in ip){print ip[i]"\t"i}}' access.log
awk '{ip[$1]++}END{for(i in ip){if(ip[i]>100)print ip[i]"\t"i}}' access.log |sort -k1 -nr |head -5
#封掉查看访问日志中连接次数超过1000次的IP
awk '{ip[$1]++}END{for(i in ip){if(ip[i]>=1000) {system("iptables -A INPUT -s "i" -j REJECT")}}}' nginx.access.log-20200428

awk函数

length([s]):返回指定字符串的长度
sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第
一个索引值为1,第二个索引值为2,…

猜你喜欢

转载自blog.csdn.net/qq_46229380/article/details/126581275