Linux程序设计环境实验1《Linux常⽤命令和Shell编程》Linux程序设计环境实验1《Linux常⽤命令和Shell编程》
⼀、实验内容
1、脚本⼀monitor.sh
脚本代码
#!/bin/bash
# 设置正常屏幕输出
reset_terminal=$(tput sgr0)
# 声明⼀个数组
declare -A script_array
# 声明并初始化循环控制变量i
i=1
# 声明并初始化提⽰信息变量tips
tips=""
# 循环遍历当前⽬录下其他⽂件
for script_file in`ls -I "monitor.sh" ./`
do
# ⽤紫⾊加粗字体输出前⼀段,输出可供选择的脚本名称及其代号
echo -e '\e[1;35m'"The Script:"${i}'=>'${reset_terminal}${script_file}
# 将脚本名字存⼊数组
script_array[$i]=${script_file}
# 更新变量值
tips="${tips} | ${i}"
# 迭代变量+1进⾏迭代
i=$((i+1))
done
# 开启另⼀个循环
while true
do
# 提⽰输⼊⼀个选择
read -p "Please input a number [${tips}] (0:exit): " choice
# 判断输⼊的是否为数字
if[[!${choice}=~ ^[0-9]+ ]];then
# ⾮数字,输出错误信息
echo"The input choice is not a Number"
else
# 如果输⼊0
if[${choice} -eq 0];then
# 输出Bye Bye
echo"Bye Bye"
# 退出执⾏脚本
exit0
# 如果输⼊的数字不在1-3内
elif[${choice} -lt 1]||[${choice} -gt 3];then
# 提⽰输⼊1-3的数字
echo"Please input a number between 1 and 3"
else
# 如果输⼊的数字在1-3内,执⾏数字代表的脚本
/bin/bash ./${script_array[$choice]}
fi
fi
done
运⾏截图
初始运⾏:
输⼊0并按下“Enter”键,退出:
2、脚本⼆system_info.sh
脚本代码
#!/bin/bash
# 刷新屏幕(但是不会清除之前的内容)
clear
# 判断运⾏脚本时是否没有传⼊参数
if[[$# -eq 0]];then
# uname是⽤于显⽰系统信息的⼀个命令
# 获取操作系统信息
os=$(uname -o)
# 输出操作系统信息
echo -e "OS Type: "$os
# 获取操作系统版本
os_version=$(cat /etc/centos-release)
# 输出操作系统版本
echo -e "OS Version: "$os_version
# 获取系统架构(x86_x64)
architecture=$(uname -m)
# 输出系统架构
echo -e "Architeture: "$architecture
# 获取内核信息
kernel=$(uname -r)
# 输出内核信息
echo -e "OS Kernel: "$kernel
# 获取主机名称
hostname=$(uname -n)
# 输出主机名称
echo -e "Hostname: "$hostname
# 获取主机所有ip地址并输出
internal_ip=$(hostname -I)
echo -e "Internal IP: "$internal_ip
# 获取主机的对外ip地址并输出
external_ip=$(curl -s ip.3322)
echo -e "External IP: "$external_ip
# 使⽤正则表达式获取dns,本机域名并输出
dns=$(cat /f |grep -E "\<nameserver[ ]+"|awk'{print $NF}')
echo -e "DNS: "$dns
# 测试当前⽹络是否连通,忽略输出信息(/dev/null⿊洞)
ping -c 2 baidu &>/dev/null &&echo"Internet Connected"||echo"Internet Disconnected"
# 将登陆者的信息保存⾄/tmp/who
who>/tmp/who
# 打印登陆者信息
echo -e "Logged "&&cat /tmp/who
# 删除上⾯保存的临时信息⽂件
rm -f /tmp/who
# 获取系统使⽤的内存情况并输出
system_memory_usages=$(awk'/MemTotal/{total=$2}/MemFree/{free=$2}END {print (total-free)/1024}' /proc/meminfo)
echo -e "System Memory Usages: "$system_memory_usages
# 获取应⽤程序使⽤的内存情况并输出
app_memory_usages=$(awk'/MemTotal/{total=$2}/MemFree/{free=$2}/^Cache/{cached=$2}/Buffers/{buffers=$2}END {print (total-free-cached-buffer s)/1024}' /proc/meminfo)
echo -e "Applications Memory Usages: "$app_memory_usages
# 获取cpu负载情况(平均负载、资源占⽤等)并输出
cpu_load_average=$(top -n 1 -b |grep"load average:"|awk'{print $10$11$12}')
echo -e "CPU Load Average: "$cpu_load_average
# 获取磁盘的使⽤情况并输出
disk_usages=$(df -hP |grep -vE 'Filesystem|tmpfs'|awk'{print $1 " " $5}')
echo -e "Disk Usages: "$disk_usages
fi
运⾏截图
上述运⾏monitor.sh的基础上输⼊3并按下“Enter”键:
3、脚本三app_info.sh
脚本代码
#!/bin/bash
# 输出⼀句话
echo"This is app_info.sh"
# 创建⼀个变量nginx_server,并为其赋值为nginx服务器地址
nginx_server='192.168.31.5'
# 创建变量mysql_server并赋值为mysql服务地址
mysql_server='192.168.31.5'
# 声明⼀个函数⽤于查看nginx状况
Nginx_info(){
# 通过curl命令请求nginx服务器并获取状态码,将结果即状态码赋值给status_code
# 这⾥-m限制最长请求时长为5s,-s减少其他信息(如进度)的输出,-w在成功后输出状态码,测试url是否正常
status_code=$(curl -m 5 -s -w %{http_code} 192.168.31.5/nginx_status -o /dev/null)
# 判断状态码为000或者⼤于500
if[$status_code -eq 000 -o $status_code -ge 500];then
# 打印错误信息
echo -e "Check Nginx Server Error"
# 打印获取的状态码
echo -e "Response Status Code is : "$status_code
else
# 打印成功信息
echo -e "Check Nginx Server OK!"
# 将nginx服务器运⾏成功的⽹页信息保存⾄ /tmp/nginx_status
curl -s 192.168.31.5/nginx_status > /tmp/nginx_status
# 显⽰上⾯保存的⽂件
cat /tmp/nginx_status
# 将上⾯的临时⽂件强制删除
rm -f /tmp/nginx_status
fi
}
# 声明⼀个函数,⽤于获取mysql的相关运⾏信息
MySQL_info(){
# 侦听192.168.31.5:3306 并将输出重定向到⽆底洞,不进⾏显⽰,限制时长2s,扫描时不发送任何数据
nc -z -w2 ${mysql_server}3306&> /dev/null
# 判断上⼀条命令的退出状态
if[$? -eq 0];then
# 上⼀条语句3306端⼝正常访问,输出访问正常信息
echo -e "Connect MySQL Server ${mysql_server}:3306 OK!"
# 先⽤账号密码登陆mysql,执⾏sql语句后获取Uptime信息
mysql_uptimes=$(mysql -uroot -p123456 -hlocalhost -e "show status" 2>/dev/null |grep'Uptime'|head -1 |awk'{print $2}') # 输出mysql更新时间,即Uptime
echo -e "MySQL Uptime: "$mysql_uptimes
else
# 3306访问不正常,输出错误信息
echo -e "Connect MySQL Server ${mysql_server}:3306 Failure!"
fi
}
# 执⾏上述定义的两个函数
Nginx_info
MySQL_info
运⾏截图
上述运⾏monitor.sh的基础上输⼊1并按下“Enter”键:
4、脚本四log_info.sh
脚本代码
#!/bin/bash
# 输出⼀句话
echo"This is log_info.sh"
# 将nginx的⽇志⽂件地址保存在变量logfile_path中
logfile_path='/usr/local/nginx/logs/access.log'
# 定义⼀个函数⽤于统计各个区间的状态码的个数以及状态码总数
Get_http_status()
{
# 通过正则表达式获取⼀系列包含状态码的信息,使⽤awk分割出⼀个个的状态码,统计区间⾥的状态码个数,保存到变量i,j,k,m,n中,最后形成数组http_status_codes
http_status_codes=(`cat ${logfile_path}|grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]][0-9]{3}"|awk'{
if($2>=100&&$2<200)
{i++}
if($2>=200&&$2<300)
{j++}
if($2>=300&&$2<400)
{k++}
if($2>=400&&$2<500)
{m++}
if($2>=500)
{n++}
}END{print i?i:0,j?j:0,k?k:0,m?m:0,n?n:0,i+j+k+m+n}' `)
# 输出上述统计结果
echo -e "The counter http status[100+]: "${http_status_codes[0]}
echo -e "The counter http status[200+]: "${http_status_codes[1]}
echo -e "The counter http status[300+]: "${http_status_codes[2]}
echo -e "The counter http status[400+]: "${http_status_codes[3]}
echo -e "The counter http status[500+]: "${http_status_codes[4]}
echo -e "The counter http status[ALL]: "${http_status_codes[5]}
linux登录命令
}
# 定义⼀个函数
Get_http_codes()
{
# 通过正则表达式和awk命令统计404和500的数量并计算所有状态码的总数
http_codes=(`cat ${logfile_path}|grep -ioE "HTTP\/1\.[1|0]\"[[:blank:]][0-9]{3}"|awk -v total=0'{
if($2!="")
{ code[$2]++; total++ }
else
{ exit }
}END{print code[404]?code[404]:0,code[500]?code[500]:0,total}' `)
# 输出上述统计结果
echo -e "The Counter of 404: "${http_codes[0]}
echo -e "The Counter of 500: "${http_codes[1]}
echo -e "The Counter of All Requests: "${http_code[2]}
}
# 调⽤上述写好的两个函数
Get_http_status
Get_http_codes
运⾏截图
上述运⾏monitor.sh的基础上输⼊2并按下“Enter”键:
⼆、实验总结
由于实验之前已经对ppt上的⼀些范例代码进⾏了编写,因此犯的低级错误不多,但是还是有。从编写完毕到成功运⾏脚本中途遇到的问题以及解决⽅式有如下⼏个:
2、有好⼏个地⽅如ping命令、获取mysql_uptimes等,少打了⼀个空格或者多打了⼀个空格导致跑出来结果不对;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。