研究学习 Linux Shell 的系列文章.
这篇文章主要讲 Shell 脚本提取系统信息和运行状态.
文章目录
1. 内容介绍
主控脚本monoitor_man.sh
调用system_monitor.sh
的两个功能:
- 提取操作系统的基本信息(内核、系统版本、网络地址等)
- 获取操作系统的运行状态(CPU负载、内存及磁盘使用率等)
2. 相关知识
2.1 提取系统信息
2.1.1 操作系统相关信息
uname
命令是unix name的缩写,可以显示操作系统的相关信息.
uname [-amnrsv][--help][--version]
-a
或--all
显示全部的信息.-m
或--machine
显示电脑类型.-n
或-nodename
显示在网络上的主机名称.-r
或--release
显示操作系统的发行编号.-s
或--sysname
显示操作系统名称.-v
显示操作系统的版本.-o
显示操作系统.--help
显示帮助.--version
显示版本信息.
/etc/issue
文件存储了与系统相关的信息. 下列命令也可查看系统信息.
cat /etc/issue
LSB是Linux Standard Base的缩写,lsb_release
命令用来显示LSB和发行版本的相关信息.
lsb_release -a
2.1.2 网络连接相关信息
hostname
一般用来显示主机名,使用-I
参数可以查看内网IP.
通过外部解析来获取公网IP.
curl -s http://myip.ipip.net/
/etc/resolv.conf
文件保存了DNS.
cat /etc/resolv.conf
ping
命令最常用来检查网络连通性. 通过检查到某个公网IP的连通性可以判断是否连接到互联网.
ping -c 2 www.baidu.com &> /dev/null && echo "Internet:Connected" || echo "Internet:Disconnected"
&>
表示标准输出流和标准错误流共同重定向.
2.1.3 登录用户相关信息
who
命令可以查看当前登录到系统的用户.
2.2 获取运行状态
2.2.1 内存运行状态
free
命令可以查看当前内存的使用状况.
free -m
系统使用内存和应用使用的内存存在区别:
- 系统使用内存 = Total - Free
- 应用使用内存 = Total - (Free + Cached + Buffers)
内存中cached
和buffer
的区别
功能 | 读取策略 | |
Cached | 缓存主要用于已经打开的文件 | 最少使用原则(LRU) |
Buffer | 缓存主要用于目录项、inode等文件系 | 先进先出策略 |
/proc
目录下都是临时文件,存储系统当前的运行状态有关的信息. /proc/meminfo
文件存储当前内存使用的情况,操作系统会动态更新.
cat /proc/meminfo
查看该文件有许多条目,我们只关心其中4个:
- MemTotal
- MemFree
- Buffers
- Cached
使用awk
命令提取相关数据
系统使用内存:
awk '/MemTotal/{total=$2}/MemFree/{free=$2}END{print (total-free)/1024}' /proc/meminfo
应用使用内存:
awk '/MemTotal/{total=$2}/MemFree/{free=$2}/^Cached/{cached=$2}/Buffers/{buffers=$2}END{print (tot al-free-cached-buffers)/1024}' /proc/meminfo
^Cached
用来提取Cached
条目并过滤SwapCached
条目.
2.2.2 CPU 运行状态
查看CPU负载
top -n 1 -b | grep "load average:" | awk '{print $12 $13 $14}'
- 三个数值分别表示1分钟、5分钟、15分钟的系统平均负载情况.
2.2.3 磁盘运行状态
df
命令意为disk free,用来显示目前在 Linux 系统上的文件系统磁盘使用情况统计.
df -h
3. 脚本实现
#!/bin/bash
#Program function: A shell script to monitor network, disk usage, uptime, load average and RAM usage in Linux.
reset_terminal=$(tput sgr0)
clear
if [[ $# -eq 0 ]]
then
# Check OS Type
os_type=$(uname -o)
echo -e '\e[0;1;95m'"OS Type:"'\e[0m' $os_type
# Check OS Release Version and Name
os_release=$(lsb_release -a | grep 'Description' --color=never | cut -f 2)
echo -e '\e[0;1;95m'"OS Release Version and Name:"'\e[0m' $os_release
# Check Architecture
os_architecture=$(uname -m)
echo -e '\e[0;1;95m'"OS Architecture:"'\e[0m' $os_architecture
# Check Kernel Release
os_kernel=$(uname -r)
echo -e '\e[0;1;95m'"OS Kernel:"'\e[0m' $os_kernel
# Check hostname
os_hostname=$(uname -n)
echo -e '\e[0;1;95m'"OS Hostname:"'\e[0m' $os_hostname
# Check Internal IP
os_internal_ip=$(hostname -I)
echo -e '\e[0;1;95m'"OS Internal IP:"'\e[0m' $os_internal_ip
# Check External IP
os_external_ip=$(curl -s http://myip.ipip.net/ | sed 's/[:, ]/:/g' | cut -f 3 -d ":")
echo -e '\e[0;1;95m'"OS External IP:"'\e[0m' $os_external_ip
# Check DNS
os_dns=$(cat /etc/resolv.conf | grep -E "\<nameserver[ ]+" | awk '{print $NF}')
echo -e '\e[0;1;95m'"OS DNS:"'\e[0m'
echo $os_dns
# Check if connected to Internet or not
echo -e '\e[0;1;95m'"OS Connected:"'\e[0m' $os_connected
ping -c 2 www.baidu.com &> /dev/null && echo "Internet:Connected" || echo "Internet:Disconnected"
# Check Logged In Users
echo -e '\e[0;1;95m'"OS Logged Users:"'\e[0m'
who
#########################
# sys_mem_usage
sys_men_usage=$(awk '/MemTotal/{
total=$2}/MemFree/{
free=$2}END{
print (total-free)/1024}' /proc/meminfo)
echo -e '\e[0;1;95m'"System Memory Usage:"'\e[0m' $sys_men_usage "MB"
# app_men_usage
app_men_usage=$(awk '/MemTotal/{
total=$2}/MemFree/{
free=$2}/^Cached/{
cached=$2}/Buffers/{
buffers=$2}END{
print (total-free-cached-buffers)/1024}' /proc/meminfo)
echo -e '\e[0;1;95m'"Application Memory Usage:"'\e[0m' $app_men_usage "MB"
# load
load_average=$(top -n 1 -b | grep "load average:" | awk '{print "1min:" $12 " " "5min:" $13 " " "15min:" $14}')
echo -e '\e[0;1;95m'"CPU Load Average:"'\e[0m' $load_average
# disk usage
echo -e '\e[0;1;95m'"Disk Usage:"'\e[0m'
df -hP | grep -vE 'Filesystem|tmpfs' | awk '{print $1 " " $3 " " $5}'
fi