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 Region
由vmlloc
内核参数来分配。分配的地址则限于vmalloc_start
与vmalloc_end
之间.每一块vmalloc
分配的内核虚拟内存都对应一个vm_struct
结构体,不同的内核空间虚拟地址之间有4k
大小的防越界空闲区间隔区。 - 永久内存映射区
- 固定内存映射区
3 图文并茂说明Linux启动流程
3.1 centos6启动流程
简述流程:
POST
:加电自检,确定启动设备,移交控制权给bootloader
。GRUB
引导阶段:分为stage1
、stage1.5
、stage2
三个阶段,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
文件建立临时伪根文件系统。
- 内核引导阶段:调用临时伪根文件系统中的init,加载驱动,然后切换至真正的根文件系统,协助呼叫进程
/sbin/init
程序。 - init初始化阶段:
/sbin/init
程序会读取/etc/inittab
文件确认运行级别,然后执行系统初始化脚本/etc/tc.sysinit
,与此同时还会根据运行级别执行对应的/etc/rc.d/rc#.d/
目录下的系统服务。还会加载/etc/rc.local
用户自定义服务。 - 启动登录终端