今天的实验要求编写一个shell程序,通过检查内核状态报告Linux内核行为,在stdout上打印你所使用的Linux主机的下列系统/内核信息:
1.系统的主机名和IP。
2.CPU类型和型号。
3.所使用的Linux内核版本。
4.当前的系统时间和从系统最后一次启动以来到已经经历了多长时间(格式为dd:hh:mm:ss)?
5.总共有多少CPU时间执行在用户态?系统态?空闲态?
6.系统中断情况?
7.内核已经进行了多少次上下文转换?
8.从系统启动以来已经创建了多少进程?
9.计算机配置的内存数和当前可用的内存数量。
并且要在上面程序的基础上,加入一个接受用户输入的界面,按用户选择打印相应的信息。如输入“1”打印系统的主机名和IP,输入“2”CPU类型和型号,……
最终编写的代码如下:
echo "实验5——内核状态实验"
echo "---------------------------------------------------"
echo "1.系统的主机名和IP"
echo "2.CPU类型和型号"
echo "3.所使用的Linux内核版本"
echo "4.当前的系统时间和从系统最后一次启动以来到已经经历了多长时间"
echo "5.总共有多少CPU时间执行在用户态/系统态/空闲态"
echo "6.系统中断情况"
echo "7.内核已经进行了多少次上下文转换"
echo "8.从系统启动以来已经创建了多少进程"
echo "9.计算机配置的内存数和当前可用的内存数量"
echo "---------------------------------------------------"
checkNum=1
while [ "$checkNum" -ne 0 ]
do
echo
echo "请输入要查询的信息编号(输入0结束程序):"
read checkNum
case $checkNum in
1) echo "系统主机名为:`hostname`"
echo "IP为:"
ifconfig|gawk '/inet addr/{print $2}'
;;
2) echo "CPU类型与型号为:"
cat /proc/cpuinfo|grep "model name"
;;
3) echo "Linux内核版本为:`gawk -F " " '/Linux version/{print $3}' /proc/version`"
;;
4) echo "当前系统时间:`date +%D%r`"
echo "系统最后一次启动到现在已经经历了:`cat /proc/uptime`"
;;
5) echo "总共有多少CPU时间执行在用户态/系统态/空闲态:"
gawk -F " " '/cpu/{print $1":"$2"/"$4"/"$5}' /proc/stat
;;
6) echo "系统中断情况:"
cat /proc/interrupts
;;
7) echo "内核进行上下文转换次数:`gawk '/ctxt/{print $2}' /proc/stat`"
;;
8) echo "从系统启动以来已经创建的进程数:`gawk '/processes/{print $2}' /proc/stat`"
;;
9) echo "计算机配置的内存数:`gawk '/MemTotal/{print $2}' /proc/meminfo`"
echo "当前可用的内存数量:`gawk '/MemFree/{print $2}' /proc/meminfo`"
;;
0) echo "程序结束!"
;;
*) echo "$checkNum 为非法输入!"
;;
esac
echo
done
实验过程中遇到的问题:
①输出语句echo “”中若有命令,需用``括起来,且echo命令会自动换行;
②有些命令本身就是将结果输出到显示器(stdout),不需要再用echo;
③case语句别忘了结束时的esac;
④可用grep命令直接筛选行信息;
⑤case语句中每个正则表达式执行语句若有多条,只在最后加上“;;”
⑥用gawk命令控制输出格式,例:gawk -F " " '/cpu/{print $1":"$2"/"$4"/"$5}' /proc/stat
其中{print $n}表示输出从“/”间的字符串算起的第n个元素,可一次输出多个元素,之间可通过双引号插入相应的字符串。
⑦系统的中断情况在/proc/interrupts虚拟文件中。
⑧/proc/uptime 中2个数字的意义,第一个数值代表系统总的启动时间,第二个数值则代表系统空闲的时间,都是用秒来表示的。
⑨awk和gawk的区别:
awk 是早期unix或是Linux下的文本处理工具,gawk是GNU所做的awk,它包括awk的所有功能,现在更趋向于用gawk。而且大部分linux发行版本已经把用gawk替换了awk,但为了保留awk的使用习惯,做了个软连接:/bin/awk -> /bin/gawk 。在用的时候,最好先确认有没有安装gawk,因为这是后期的GNU的工具,可能早期版本不一定安装。