一行 Shell 汇总:三剑客抓取系统信息

114 阅读2分钟

我们以 Debian 11 为例,尽管如此,以下命令完全适用于 Debian 系和 CentOS 系等 Linux 发行版。

image.png

查看 OS 系统版本信息

# 查看系统发行版
root@localhost:~# awk 'BEGIN { FS="""; OFS="" } /PRETTY_NAME/{ val=$(NF-1) } END { split(val, a, fs=" "); print(tolower(a[1]), a[3]) }' /etc/os-release
debian11

# 查看小版本
root@localhost:~# cat /etc/debian_version
11.5

查看 Linux 内核信息

root@localhost:~# uname -a
Linux localhost 5.19.0-0.deb11.2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.19.11-1~bpo11+1 (2022-10-03) x86_64 GNU/Linux

root@localhost:~# cat /proc/version
Linux version 5.19.0-0.deb11.2-amd64 (debian-kernel@lists.debian.org) (gcc-10 (Debian 10.2.1-6) 10.2.1 20210110, GNU ld (GNU Binutils for Debian) 2.35.2) #1 SMP PREEMPT_DYNAMIC Debian 5.19.11-1~bpo11+1 (2022-10-03)

查看主机唯一标识

# 查看host的uuid
root@localhost:~# cat /sys/class/dmi/id/product_uuid
7c0c0042-0045-4b10-8024-c9c04f876707

查看网络(网卡)信息

这里按实际情况调整,可能会因配置而不同:

# 查看IP地址
root@localhost:~# ip addr | awk '/inet .* scope global/ && !/127.0.0.1/ {split($2, a, "/"); print a[1]}'
192.168.100.30

root@localhost:~# ip a | awk '{match($0, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip=substr($0,RSTART,RLENGTH); if ($0!~"127.0.0.1") print ip}' | awk '!/^$/'
192.168.100.30

# 查看MAC地址
root@localhost:~# ip link | grep -w "state UP" -A 1 | awk '/ether/ {print $2}'
00:50:56:80:cb:40

# 查看网卡设备号
root@localhost:~# ip addr | awk '/state UP/ {gsub(/:/,"",$2); print $2}'
enp10s0f0np0

通过系统 ipmitool 操作带外模块

# 查看带外ip地址
root@localhost:~# ipmitool lan print 1 2> /dev/null | awk 'BEGIN {FS="[: ]"} /IP Address\s+:/{val=$NF} END {if(length(val)>0) print "BMC IP:", val; else print "BMC IP: NULL"}'
BMC IP: 10.50.128.22

查看 MEM 内存

查看系统内存

# 通过读取/proc/meminfo虚拟文件系统
root@localhost:~# awk '/MemTotal/{printf "%.2fGi\n", $2/1024/1024}' /proc/meminfo
125.28Gi

# 通过查看free命令
root@localhost:~# free -h | awk '/Mem/{print $2}'
125Gi

查看已装配内存条数

root@localhost:~# dmidecode -t memory | sed 's/^\t//' | grep "^Size:" | grep -v "No Module" | wc -l
2

查看 RAM 总大小

root@localhost:~# dmidecode -t memory | sed 's/^\t//' | grep "^Size:" | grep -v "No Module" | awk '{total += $2} END {print total"GB"}'
128GB

查看内存使用率

free 输出示例:

root@localhost:~# free
               total        used        free      shared  buff/cache   available
Mem:         8129004     1663084      172728        3128     6596120     6465920
Swap:              0           0           0

- "total":这是系统总共的内存量。
- "free":这部分内存是目前完全没有被使用的,等待应用请求后分配。
- "shared" 这部分是指多个进程共享的内存量。当多个进程运行了相同的程序或加载了相同的库,Linux会尽量减少内存使用,让这些进程共享同一块内存空间。这空间中保存的数据可以被所有有权访问的进程同时读取,这样就减少了内存的使用,并可以提高程序的运行效率。此外,"shared"还可能包括tmpfs文件系统(如/dev/shm和/run)使用的内存量。
- "buffers/cache":这部分内存是用于存储临时数据的缓冲区和磁盘缓存。Linux 系统会尽可能地使用所有剩余内存作为缓冲区和缓存,以提高系统性能。但是一旦应用程序需要更多内存,这部分内存可以立即释放出来供应用程序使用,因此,这部分内存虽然看起来是 "已使用" 的,但实际上它是可以被立即回收的。

如果只是想粗略地查看内存使用率,可以直接使用 used / total * 100% 这个公式来计算。在这个公式中,"used" 包含了正在被应用程序使用的内存,以及作为缓冲区和缓存的内存。

root@localhost:~# free | awk 'NR==2{print $3/$2 * 100}'
19.8226

但是,请注意这样的计算可能会让内存使用率看起来比实际的情况要高。因为 Linux 系统会尽可能地使用所有剩余的内存作为缓冲区和缓存,提高系统性能。但是,这部分作为缓冲区和缓存的内存在需要的时候是可以立即释放、供应用程序使用的。

因此,如果需要准确地知道系统内存使用情况,即应用程序实际使用的内存占总内存的比例,用 (total - free - buffers/cache) / total * 100% 这个公式计算将更为准确。在这个公式里,把作为缓冲区和缓存的内存从 "used" 里剔除出去,这样计算出来的内存使用率才是能准确反映当前系统为应用程序服务的内存使用的情况。

root@localhost:~# free | awk '/^Mem:/{print (100-($4+$6)/$2*100)}'
16.6474

查看 CPU 处理器

物理 CPU 颗数

# 通过查看dmidecode命令
root@localhost:~# dmidecode -t processor | grep -i "Core Count" | wc -l
2

# 使用grep, sort, 和wc命令的组合
root@localhost:~# cat /proc/cpuinfo | grep -i "physical id" | sort -u | wc -l
2

# 使用awk命令, 存储数组并计算长度
root@localhost:~# awk '/physical id/ { cpu_ids[$NF] } END { print length(cpu_ids) }' /proc/cpuinfo
2

单颗 CPU 信息统计

# 单颗CPU的物理核心数
root@localhost:~# sed -n '1,/^$/p' /proc/cpuinfo | awk '/cpu cores/{print $NF}'
32

# 单颗CPU的逻辑线程
root@localhost:~# sed -n '1,/^$/p' /proc/cpuinfo | awk '/siblings/{print $NF}'
64

是否开启超线程

root@localhost:~# awk '/siblings/ { siblings=$3 } /cpu cores/ { cpu_cores=$4 } END { if (siblings >= (2 * cpu_cores)) print "true"; else print "false" }' /proc/cpuinfo
true

总逻辑线程数

root@localhost:~# echo "$(awk '/siblings/{print $NF}' /proc/cpuinfo | head -n 1) * $(dmidecode -t processor | grep -c "Core Count")" | bc
128

逻辑处理器数量(等于逻辑线程数)

# 通过读取/proc/cpuinfo虚拟文件系统
root@localhost:~# grep -c "processor" /proc/cpuinfo
128

# 通过查看lscpu命令
root@localhost:~# lscpu -p | grep -v '^#' | wc -l
128

# 通过查看目录个数
root@localhost:~# find /sys/devices/system/cpu/ -name "cpu[0-9]*" -type d | wc -l
128

# 最直接的输出:nproc 命令会直接显示可用的 CPU 核心数(包括虚拟核心)
root@localhost:~# nproc
128

查看 Disk 大小

root@localhost:~# lsblk -b -l | awk '/sda /{printf"%.0f\n", $4/1024/1024/1024}'
1863

查看 Python 版本号

# 2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)
root@localhost:~# python3 --version 2>&1 | awk '{print $2}' | cut -d '.' -f 1,2
3.9

遍历目录下所有文件的绝对路径(含子目录)

root@localhost:~# dir="/etc/apt/"; ls -lR ${dir} | awk -v p=${dir} '!/^total|^$|:$/{system("find "p" -type f -name *"$NF"*")}'
/etc/apt/listchanges.conf
/etc/apt/sources.list
/etc/apt/sources.list~
/etc/apt/sources.list.bak
/etc/apt/trusted.gpg
/etc/apt/apt.conf.d/00CDMountPoint
/etc/apt/apt.conf.d/00trustcdrom
/etc/apt/apt.conf.d/01autoremove
/etc/apt/apt.conf.d/01autoremove-kernels
/etc/apt/apt.conf.d/01autoremove-kernels
/etc/apt/apt.conf.d/20listchanges
/etc/apt/apt.conf.d/70debconf