【Linux】【Shell】系统信息及运行状态获取

研究学习 Linux Shell 的系列文章.

这篇文章主要讲 Shell 脚本提取系统信息和运行状态.

1. 内容介绍

主控脚本monoitor_man.sh调用system_monitor.sh的两个功能:

  1. 提取操作系统的基本信息(内核、系统版本、网络地址等)
  2. 获取操作系统的运行状态(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)

内存中cachedbuffer的区别

功能 读取策略
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

猜你喜欢

转载自blog.csdn.net/RadiantJeral/article/details/112055840