shell之路 习题100例
准备环境
这里使用两台阿里云服务器测试,其中一台是运行网站程序
空机器(裸机,只安装了系统Centos7):m1 IP:47.244.191.206
待检测机器:m2 , IP:47.104.178.202
系统:Centos6.10
网站架构:LNMP(采用yum安装)
网站代码程序:PHP
1.检测机器是否宕机(1)
监控一台远程主机
脚本运行在m1
#!/bin/bash # qq:598779784 # author:ecithy # 功能:检测远程机器是否存活 target_ip='47.104.178.202' echo -e "\033[32m检测的机器: $target_ip \033[0m" loss_packet_rate=`ping -c2 $target_ip | grep 'packet' | awk -F ',' '{print $3}' | awk '{print substr($1,1,1)}'` if [ $loss_packet_rate -eq 0 ];then echo "检测结果:机器正常" elif [ $loss_packet_rate -lt 50 ];then echo "检测结果:机器不正常,丢包率: $loss_packet_rate" else [ $loss_packet_rate -ge 50 ] echo "检测结果:机器宕机, 丢包率: $loss_packet_rate" fi
调试ping命令
ping -cn ip # ping几次某台机器
编码并执行
2.检测服务是否正常(1)
检测Nginx
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能:检测Nginx服务是否正常 nginx_line=`netstat -lnp | grep nginx | wc -l` cmd_restart_nginx="service nginx restart" if [ $nginx_line -ne 0 ];then echo "Nginx服务正常" else echo "Nginx服务不在,尝试重启中..." $cmd_restart_nginx fi
调试nginx命令
编码并执行
3.监控系统指标(3)
3.1 记录磁盘使用情况
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能:每天记录磁盘情况到文件 log_dir=/data/logs/disklog log_file=$log_dir/`date +%F`.log # 日期 # 目录存在性判断 if [ ! -d $log_dir ] then mkdir -p $log_dir fi # 磁盘情况记录到日志文件 df -h | grep 'vda1' >> $log_file
shell调试
编码并执行
3.2 监控CPU使用率
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能:监控CPU使用率,10秒一次 # 注意:处理小数运算(if []内只能进行整数间的运算) compare_numbers(){ # 比较两个小数的大小,is_gt=0代表大于,1代表小于 is_gt=`awk -v num1=$1 -v num2=$2 'BEGIN{print(num1>num2)?0:1}'` echo $is_gt } check_cpu(){ cpu_free_rate=`top -bn1 | head | grep Cpu | awk -F ',' '{ print substr($4, 2, 4) }'` cpu_use_rate=`awk -v var1=$cpu_free_rate 'BEGIN{print 100-var1 }'` res=`compare_numbers $cpu_free_rate $cpu_use_rate` # 比较小数 if [ $res -eq 0 ];then echo "CPU使用率较为稳定: ${cpu_use_rate}%" else echo "CPU使用率偏高: ${cpu_use_rate}%" fi } while : do check_cpu sleep 10 done
调试top命令
第三行99.7%id代表CPU空闲率为99.7%
编码并执行
3.3 监控进程内存使用情况
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能: 统计所有进程占用内存总和 #!/bin/bash std_ps=`ps aux | awk '{print $6}'` # $n是一个数组 sum=0 for i in $std_ps do let sum=$sum+$i/1024 #ps aux单位为K,换成M done echo "所有进程占用内存总和: ${sum}M"
调试ps命令
编码并执行
4.文件批处理(2)
4. 1 批量创建文件
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能: 批量创建文件 # ------------------函数定义------------------ create_file(){ # 在当前目录创建10个文件 filename="touch x.txt" # $n是一个数组 sum=0 nums_1_10=`seq 1 10` for i in $nums_1_10 do file_name=${filename/x/$i} echo $file_name $file_name done } write_to_file(){ #给某个文件写入数据 cat <<EOF >$1 hello shell EOF } create_dir(){ # 目录不存在则创建 echo $1 if [ ! -d $1 ];then mkdir $1 fi cd $1 #进入testDir目录 } # ------------------主逻辑------------------ # 在当前目录下创建一个目录testDir,testDir目录下继续创建: #一个空目录、10个(其中文件1.txt写入hellop shell) create_dir testDir create_file write_to_file 1.txt mkdir emptyDir
调试函数create_file write_to_file
编码并执行
4.2 批量删除空文件
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能:删除指定目录下空文件和空目录 # 搜索空文件和空目录 find ./testDir -type f -size 0c -exec ls {} \; find ./testDir -type d -empty # 删除空文件 find ./testDir -type f -size 0c -exec rm -f {} \; # 删除空目录 find ./testDir -type d -empty -exec rm -rf {} \;
调试find命令
编码并执行
5.日志文件处理(1)
统计IP访问情况
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能:统计每个IP访问量和IP总数 ip_access=`awk '{print $1}' /var/log/nginx/access.log | uniq -c` ip_count=`awk '{print $1}' /var/log/nginx/access.log | uniq -c | wc -l` echo "ip总数: $ip_count" echo -e "每个IP访问量:\n$ip_access"
调试awk uniq wc 命令
查看日志数据
第一列:每个IP数,第二列:IP
统计IP总数
编码并执行
6.输入数字执行命令(2)
6. 1 输入数字执行普通命令
脚本运行在m1
#!/bin/bash # qq:598779784 # author:ecithy # 功能: 输入一个数字,然后运行对应的一个命令 #!/bin/bash echo "输入数字" read -p "Please input a number: " num if [ -z num ] then echo "输入为空" exit fi case $num in 1) date ;; 2) ls ;; 3) who ;; 4) pwd ;; *) echo "请输入1-4的数字" ;; esac
编码并执行
6. 2 输入数字执行函数
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能: 输入一个数字,然后运行对应的一个函数 # -------------------- 函数定义 -------------------- checkNginxActive(){ # 检测Nginx服务是否正常 nginx_line=`netstat -lnp | grep nginx | wc -l` cmd_restart_nginx="service nginx restart" if [ $nginx_line -ne 0 ];then echo "Nginx服务正常" else echo "Nginx服务不在,尝试重启中..." $cmd_restart_nginx fi } checkMachineActive(){ # 检测远程机器是否存活 target_ip='47.244.191.206' echo -e "\033[32m检测的机器: $target_ip \033[0m" loss_packet_rate=`ping -c2 $target_ip | grep 'packet' | awk -F ',' '{print $3}' | awk '{print substr($1,1,1)}'` if [ $loss_packet_rate -eq 0 ];then echo "检测结果:机器正常" elif [ $loss_packet_rate -lt 50 ];then echo "检测结果:机器不正常,丢包率: $loss_packet_rate" else [ $loss_packet_rate -ge 50 ] echo "检测结果:机器宕机, 丢包率: $loss_packet_rate" fi } # -------------------- 主逻辑 -------------------- echo "输入数字" echo "1:检测Nginx服务是否正常" echo "2:检测远程机器是否存活" read -p "Please input a number: " num if [ -z num ] then echo "输入为空" exit fi case $num in 1) checkNginxActive ;; 2) checkMachineActive ;; *) echo "请输入1-4的数字" ;; esac imputExeFunction.sh
7.获取系统信息(1)
脚本运行在m2
#!/bin/bash # qq:598779784 # author:ecithy # 功能:获取机器CPU核、内存、磁盘 # -------------------- 函数定义 -------------------- GetSysInfo(){ # 检测Nginx服务是否正常 cpu_cores=`lscpu | awk '/^CPU\(s\):/{print $2}'` mem_size=`free -h | awk '/Mem/{print $2}'` disk_size=`df -h | awk '/^\/dev/{print $2}'` echo -e "CPU核:$cpu_cores\n内存:$mem_size\n磁盘:$disk_size" } # -------------------- 主逻辑 -------------------- GetSysInfo
调试命令
编码并执行
转载于:https://www.cnblogs.com/hyit/articles/11169462.html