第四周作业

1、自定义写出10个定时任务的示例:

1.1 每隔5分钟检查一次磁盘占用率

[21:16:16 root@rocky scripts]$ cat while_diskcheck.sh
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-17
#FileName:          while_diskcheck.sh
#Description:       定时检查磁盘并发送报警邮件 
#***********************************************************
WARNING=80
while :;do
    df -h|grep '^/dev'|sed -rn 's/.* ([0-9]+)%.*/\1/p'|while read line;do
        if [ $line -gt $WARNING ];then
            echo Disk will be full from `hostname -I`|mail -s "disk warning" lgq6579@163.com
        fi
    done
    sleep 5m
done

[21:21:04 root@rocky data]$ crontab -l
*/5 * * * * sh /data/scripts/while_diskcheck.sh &> /data/log/disk_check-`date +\%F_\%T`.log

1.2 每周工作日00:30备份/data/scripts目录到/backup目录,保存的文件名称格式为“scripts-yyyy-mm-dd-

HH.tar.xz”,其中日期是前一天的时间

[21:33:06 root@rocky scripts]$ cat backup.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-03
#FileName:          backup.sh
#Description:       定时备份 
#***********************************************************
COLOR='echo -e \E[1;35m'
END='\E[0m'
${COLOR}"Backup is staring!"${END}
tar zcf /backup/scripts-`date -d '-1 day' +%Y-%m-%d-%H`.tar.gz /data/scripts
${COLOR}"Backup is finished!"${END}

[21:33:10 root@rocky scripts]$ crontab -l
10 0 * * * 3 sh /data/scripts/backup.sh &> /data/log/backup.log

1.3 每隔两个月的每隔10天扫描一下网段在线状态

[21:37:07 root@rocky scripts]$ cat for_scan_host.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-17
#FileName:          for_scan_host.sh
#Description:       扫描一个网段:10.0.0.0/24,判断此网段
#                   中主机在线状态,将在线的主机IP打印出来 
#***********************************************************
NET=10.0.0
for i in {1..254};do
    {
    if ping -c1 -W1 $NET.$i &> /dev/null;then
        echo $NET.$i is up >> /data/log/scan_host.log
    fi
    }&
done

[21:42:07 root@rocky scripts]$ crontab -l
* * */10 */2 * sh /data/scripts/for_scan_host.sh

1.4 8月每周的1,3,5的8-18点每隔2小时扫描一下本机的端口开启情况

[22:28:08 root@rocky scripts]$ cat scan_host_port.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-17
#FileName:          scan_host_port.sh
#Description:       扫描某主机的端口开启情况 
#***********************************************************
i=1
HOST=`ip addr show eth0|sed -rn '3s/[^0-9]+([0-9.]+).*/\1/p'`
while i <= 65535;do
    if nc -z $HOST $i &> /dev/null;then
        echo $i|tee -a /data/log/port.txt
    fi
done

[22:17:58 root@rocky log]$ crontab  -l
0 8-18/2 * 8 1-6/2 sh /data/scripts/scan_host_port.sh &> /data/log/scan_port.log

1.5 工作日每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中

[22:42:06 root@rocky scripts]$ cat meminfo.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-22
#FileName:          meminfo.sh
#Description:       提取系统/proc/meminfo文件以S或M开头的行 
#***********************************************************
cat /proc/meminfo |grep "^[SM]" >> /tmp/meminfo.txt

[22:45:15 root@rocky log]$ crontab  -l
0 */2 * * 1-5 sh /data/scripts/meminfo.sh &> /data/log/meminfo.log

1.6 工作日9-16点每隔3小时实时查看网卡流量

[15:05:06 root@rocky scripts]$ cat /data/scripts/scan_eth.sh
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-23
#FileName:          scan_eth.sh
#Description:       实时查看网卡流量 
#***********************************************************
NIC=$1
echo -e " In ------ Out"
i=1
while ((i<=10)); do
    OLD_IN=$(grep $NIC /proc/net/dev|awk '{print $2}')
    OLD_OUT=$(grep $NIC /proc/net/dev|awk '{print $10}')
    sleep 10
    NEW_IN=$(grep $NIC /proc/net/dev|awk '{print $2}')
    NEW_OUT=$(grep $NIC /proc/net/dev|awk '{print $10}')
    IN=$(printf "%.2f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
    OUT=$(printf "%.2f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
    echo "$IN $OUT"
    sleep 1
    let i++
done

[15:04:57 root@rocky scripts]# crontab -l
0 9-16/3 * * 1-5 sh /data/scripts/scan_eth.sh &> /data/log/scan_eth.log

1.7 每十分钟检查将连接数超过100个以上的IP放入黑名单拒绝访问

[23:02:15 root@rocky scripts]$ cat deny_dos.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-24
#FileName:          deny_dos.sh
#Description:       将连接数超过100次以上的IP放入黑名单拒绝其访问 
#***********************************************************
LINK=100
while :;do
    ss -nt|awk -F" +|:" '/^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

[23:00:59 root@rocky scripts]$ chmod +x deny_dos.sh 
[23:02:10 root@rocky scripts]$ crontab -l
*/10 * * * * /data/scripts/deny_dos.sh

1.8、工作日每天的11点和17点查看服务器各个利用率

[18:19:33 root@rocky scripts]$ cat used.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-25
#FileName:          used.sh
#Description:       显示服务器利用率 
#***********************************************************
#!/bin/bash
function cpu(){
    util=$(vmstat | awk 'NR==3{print $13+$14}')
    iowait=$(vmstat | awk 'NR==3{print $16}')
    echo "CPU -使用率:${util}% ,等待磁盘IO相应使用率:${iowait}:${iowait}%"
}
function memory (){
    total=`free -m |awk 'NR==2{printf "%.1f",$2/1024}'`
    used=`free -m |awk 'NR==2{printf "%.1f",($2-$NF)/1024}'`
    available=`free -m |awk 'NR==2{printf "%.1f",$NF/1024}'`
    echo "内存 - 总大小: ${total}G , 使用: ${used}G , 剩余: ${available}G"
}
disk(){
    fs=$(df -h |awk '/^\/dev/{print $1}')
    for p in $fs; do
        mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
        size=$(df -h |awk '$1=="'$p'"{print $2}')
        used=$(df -h |awk '$1=="'$p'"{print $3}')
        used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
        echo "硬盘 - 挂载点: $mounted , 总大小: $size , 使用: $used , 使用率: $used_percent"
    done
}
function tcp_status() {
    summary=$(ss -antp |awk 'NR!=1{status[$1]++}END{for(i in status) printf i":"status[i]" "}')
    echo "TCP连接状态 - $summary"
}
cpu
memory
disk
tcp_status

[18:19:37 root@rocky scripts]$ sh used.sh 
CPU -使用率:1% ,等待磁盘IO相应使用率:0:0%
内存 - 总大小: 1.7G , 使用: 0.4G , 剩余: 1.3G
硬盘 - 挂载点: / , 总大小: 70G , 使用: 13G , 使用率: 19%
硬盘 - 挂载点: /boot , 总大小: 1014M , 使用: 212M , 使用率: 21%
硬盘 - 挂载点: /home , 总大小: 127G , 使用: 939M , 使用率: 1%
TCP连接状态 - LISTEN:5 ESTAB:2

[18:26:22 root@rocky scripts]$ crontab -l
0 11,17 * * 1-5 sh /data/scripts/used.sh &> /data/log/used.log

1.9、工作日每天8-18点每隔半小时查看占用CPU 内存过高的进程

[19:10:08 root@rocky scripts]$ cat cpu_mem_top10.sh 
#!/bin/bash
#
#***********************************************************
#Author:            yanli
#Date:              2022-08-25
#FileName:          cpu_mem_top10.sh
#Description:       查找cpu内存过高的进程
#***********************************************************
echo "-------------------CUP占用前10排序--------------------------------"
ps -eo user,pid,pcpu,pmem,args --sort=-pcpu |head -n 10
echo "-------------------内存占用前10排序--------------------------------"
ps -eo user,pid,pcpu,pmem,args --sort=-pmem |head -n 10

##定时任务
[19:11:35 root@rocky scripts]# crontab -l
*/30 8-18 * * 1-5 sh /data/scripts/cpu_mem_top10.sh &> /data/log/cpu_mem_top10.log

1.10 定时任务汇总输出

[19:16:18 root@rocky scripts]$ crontab -l
*/5 * * * * sh /data/scripts/while_diskcheck.sh &> /data/log/disk_check-`date +\%F_\%T`.log

30 0 * * * 1-5 sh /data/scripts/backup.sh &> /data/log/backup.log

* * */10 */2 * sh /data/scripts/for_scan_host.sh

0 8-18/2 * 8 1-6/2 sh /data/scripts/scan_host_port.sh &> /data/log/scan_port.log

0 */2 * * 1-5 sh /data/scripts/meminfo.sh &> /data/log/meminfo.log

0 9-16/3 * * 1-5 sh /data/scripts/scan_eth.sh &> /data/log/scan_eth.log

*/10 * * * * /data/scripts/deny_dos.sh

0 11,17 * * 1-5 sh /data/scripts/used.sh &> /data/log/used.log

*/30 8-18 * * 1-5 sh /data/scripts/cpu_mem_top10.sh &> /data/log/cpu_mem_top10.log

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

进程(process)是个可执行的实例。
进程一般由程序、数据集合和进程控制块三部分组成。

  • 程序是用于描述进程要完成的功能,是控制进程执行的指令集
  • 数据集合是程序在执行时所需要的数据和工作区
  • 程序控制块(Program Control Block,PCB)包含进程的描述信息和控制信息,是进程存在的唯一标识。

每个进程都有一个创建自己的进程,即父进程。如果子进程的父进程终止,则子进程就会变成“孤儿”,初始进程init进程随即将其收养。

2.1 进程虚拟内存(用户空间)布局

每个进程所分配的内存有很多部分组成,通常称之为段(segment)

  • 代码段:用来存放可执行文件的操作指令,代码段需要防止在运行实被非法修改,所以只有读权限。
  • 数据段:用来存放可执行文件中以初始化全局变量,换句话就是存放程序静态分配的变量和全局变量
  • BSS段:包含了程序中未初始化的全局变量,在内存中BSS段全部置零。
  • 堆(heap):存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上;当利用free等函数释放内存时,被释放的内存从堆中被剔除。
  • 栈(stack):用户存放程序临时创建的局部变量,也就是函数中定义的变量。在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。栈是先进先出的特点。

内核管理5个部分的方式是,将这些内存区域抽象成vm_area_struct的内存管理对象。用来描述进程地址空间的基本管理单元,一个进程往往有多个vm_area_struct来描述它的用户空间虚拟地址

2.2 内核空间

  • 直接映射区:直接映射物理地址
  • 动态内存映射区:vmalloc Regionvmlloc内核参数来分配。分配的地址则限于vmalloc_startvmalloc_end之间.每一块vmalloc分配的内核虚拟内存都对应一个vm_struct结构体,不同的内核空间虚拟地址之间有4k大小的防越界空闲区间隔区。
  • 永久内存映射区
  • 固定内存映射区

3 图文并茂说明Linux启动流程

3.1 centos6启动流程

‎启动流程 ‎硬件引导启动 ‎POST ‎加电自检,检测系统外围主要设备 ‎确定启动设备 ‎根据BIOS设置的启动顺序,检测驱动器 ‎若启动项是硬盘,将读取硬盘的第一个扇‎区(MBR,512字节)到内存 ‎控制权转交到MBR中的Bootloader ‎GRUB启动引导阶段 ‎Stage1阶段 ‎找到MBR的前446字节,将MBR加载到内‎存中,引导系统启动装载Stage2 ‎Stage1.5阶段 ‎MBR之后的空间,让stage1中的‎bootloader能识别stage2所在的分区上的‎文件系统 ‎是stage1和stage2的桥梁 ‎GRUB访问/boot/grub目录下的stage2文‎件,将stage2加载到内存 ‎Stage2阶段 ‎解析grub的配置文件/boot/grub/grub.‎conf ‎显示操作系统启动菜单 ‎加载内核文件(vmlinuz-VERSION-‎release)到内存 ‎通过/boot/initramfs-$(uname -r).img建‎立临时根文件系统 ‎转交给kernel ‎kernel引导阶段 ‎调用临时根文件系统中的init ‎加载驱动模块初始化系统中的各种设备并‎做相关配置,其中包括CPU、I/O、存储设‎备 ‎加载并切换到真正的根文件系统(grub.‎conf文件中的root=""所指的部分) ‎协助内核呼叫进程/sbin/init程序 ‎init初始化阶段 ‎读取/etc/inittab ‎初始用户运行级别 ‎运行系统初始化脚本/etc/rc.sysinit ‎设置主机名 ‎设置欢迎信息 ‎决定是否激活udev和selinux ‎挂载/etc/fatab文件中定义的文件系统 ‎检测根文件系统,并以读写方式重新挂载‎根文件系统 ‎设置系统时钟 ‎激活swap设备 ‎根据/etc/sysctl.conf文件设置内核参数 ‎激活lvm及software raid设备 ‎加载额外设备的驱动程序 ‎清理启动过程中的临时文件 ‎加载系统服务 ‎独立服务/etc/rc.d/rc#.d ‎根据运行级别启动对应/etc/rc.d/rc#.d目‎录下的服务(#表示0-6) ‎S开头文件,表示开机启动 ‎K开头文件,表示开机不启动 ‎非独立服务 ‎按需激活,被xinetd代理,配置在/etc/‎xinetd.conf和/etc/xinetd.d中 ‎/etc/rc.local ‎最后一级别的服务,可以放置不便将服务‎放置于/etc/rc.d/init.d/目录中,又想开机‎自启动的命令 ‎启动终端 ‎默认情况下执行/sbin/mingetty打开6个纯‎文本终端 ‎验证登录 ‎/etc/securetty:登记的终端才允许使‎用,没有该文件任何终端都可以使用 ‎/etc/passwd &#38; /etc/shadow:来验证密‎码以及设置账户的主目录是什么、使用何‎种shell类型 ‎登录成功 ‎屏幕输出 ‎/var/log/lastlog:输出最近一次登录的信‎息 ‎/var/spool/mail/用户名:检查用户是否有‎新邮件 ‎加载环境变量 ‎/etc/profile ‎~/.bash_profile | ~/.bash_login | ~/.‎profile ‎~/.bashrc ‎/etc/bashrc ‎若运行级别为5,则打开图形界面

简述流程:

  1. POST:加电自检,确定启动设备,移交控制权给bootloader
  2. GRUB引导阶段:分为stage1stage1.5stage2三个阶段,
    • stage1:找到MBR前446字节,将MBR加载到内存
    • 1.5 stage:MBR之后的空间,让stage1中的bootloader能识别stage2所在的分区上的文件系统
    • stage2:解析加载到内存的/boot/grub/grub.conf文件;加载内核文件/boot/vmlinuz-VERSION-release到内存;另外通过/boot/initramfs-$(uname -r).img文件建立临时伪根文件系统。
  3. 内核引导阶段:调用临时伪根文件系统中的init,加载驱动,然后切换至真正的根文件系统,协助呼叫进程/sbin/init程序。
  4. init初始化阶段:/sbin/init程序会读取/etc/inittab文件确认运行级别,然后执行系统初始化脚本/etc/tc.sysinit,与此同时还会根据运行级别执行对应的/etc/rc.d/rc#.d/目录下的系统服务。还会加载/etc/rc.local用户自定义服务。
  5. 启动登录终端

3.2 centos7以后版本启动流程