一个轻量的Linux监控脚本
我的生命不长,但是,如你所说,我是自己生命的主宰。—–《阳光姐妹淘》
写在前面
我的需求
- 嗯,有几台很老的机器,上面部署的几个很老的应用
- 我需要每周对机器上的一些内存,磁盘,线程,应用和数据库进行
巡查监控
,输出运维报告
- 因为是很老的东西,所以不敢随便乱动,怕掉坑里.
- 每次巡查都是通过通过命令行的方式一个一个指标处理的。
我是这样做的
- 写了一个
巡查脚本
,输出一些需要监控的核心指标
- 脚本获取指标只使用系统自带的一些命令,没有安装任何工具。
- 这里要说明:这种方式很 old,对于这样的多机器
自动化巡查监控
- 如果只是基础指标监控,
轻量
一点可以使用: Ansible
利用template
等模块,魔法变量
、系统变量
直接获取指标信息
- 或者
ansible-galaxy
找找有没有相关的角色
- 如果需要
告警
、监控触发器
、自动发现
、主被动监控
之类的功能,则需要部署一些重量级
的: - 可以使用
Prometheus
、Zabbix
、Nagios
、Cacti
等 - 通过容器化的方式也是很容易实现的。
我的生命不长,但是,如你所说,我是自己生命的主宰。—–《阳光姐妹淘》
下面就脚本和小伙伴简单介绍下,如果小伙伴也有我这样的情况,可以参考。主要监控信息有以下几部分内容
- 系统基础信息
- 内存交换分区相关信息
- CPU相关信息
- 磁盘和IO相关信息
- 进程相关信息
- 网络相关信息
系统基础信息
系统基础信息包括一下几部分:
- 内核信息
- 操作系统版本
- 当前时间及系统运行时间
- 当前登录用户数
1 | ┌──[root@vms81.liruilongs.github.io]-[~] |
对应的脚本中的函数
1 | function bash_os() { |
内存交换分区相关信息
内存信息包括一下几部分:
- 总内存容量
- 用户程序内存量
- 多进程共享内存量
- 缓存占用内存量
- 空闲内存容量
- 剩余可用内存容量
- 可用内存百分比
- 总的交换分区容量
- 用户使用的交换分区容量
- 剩余交换分区容量
- 可用交换分区占比
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38################## 内存 ############
------------------------------------
|总内存容量: 3.10G
------------------------------------
|用户程序内存量: 1.21G
------------------------------------
|多进程共享内存量: 0.02G
------------------------------------
|缓存占用内存量: 1759MB
------------------------------------
|空闲内存容量: 0.18G
------------------------------------
|剩余可用内存容量: 1.57G
------------------------------------
|可用内存百分比: 50.68%
------------------------------------
############## 交换分区 #############
------------------------------------
总的交换分区容量: 0.00G
------------------------------------
|用户使用的交换分区容量: 0.00G
------------------------------------
|剩余交换分区容量: 0.00G
------------------------------------
|占用内存资源最多的10个进程列表:
434568 kube-apiserver --advertise-address=192.168.26.81 --allow-privileged=true --token-auth-file=/etc/kubernetes/pki/liruilong.csv --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-issuer=https://kubernetes.default.svc.cluster.local --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
140716 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.5
95636 kube-controller-manager --allocate-node-cidrs=true --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-cidr=10.244.0.0/16 --cluster-name=kubernetes --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --port=0 --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --service-cluster-ip-range=10.96.0.0/12 --use-service-account-credentials=true
94252 etcd --advertise-client-urls=https://192.168.26.81:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://192.168.26.81:2380 --initial-cluster=vms81.liruilongs.github.io=https://192.168.26.81:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.26.81:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.26.81:2380 --name=vms81.liruilongs.github.io --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
90888 /usr/bin/dockerd --insecure-registry 192.168.26.56 -H fd:// --containerd=/run/containerd/containerd.sock
44736 /usr/bin/containerd
43584 calico-node -felix
40900 kube-scheduler --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/etc/kubernetes/scheduler.conf --bind-address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true --port=0
37572 calico-node -allocate-tunnel-addrs
37284 calico-node -confd%
------------------------------------
对应的脚本中的函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61function memory() {
# 内存相关数据统计`free -m`
#总内存容量
mem_total=$(free -m | awk '/Mem/{printf "%.2fG", $2/1024}')
# 用户程序占用内存量
mem_user=$(free -m | awk '/Mem/{printf "%.2fG", $3/1024}')
# 多进程共享占用内存量
mem_shared=$(free -m | awk '/Mem/{printf "%.2fG", $5/1024}')
#缓存占用内存量
mem_buff_cache=$(free -m | awk '/Mem/{printf "%.fMB", $(NF-1)}')
#空闲内存容量
mem_free=$(free -m | awk '/Mem/{printf "%.2fG", $4/1024 }')
# 剩余可用内存容量
mem_available=$(free -m | awk 'NR==2{printf "%.2fG",$NF/1024}')
# 可用内存使用占比
mem_percentage=$(free -m | awk '/Mem/{printf "%.2f", $NF/$2*100}')
#总的交换分区容量
swap_total=$(free -m | awk '/Swap/{printf "%.2fG", $2/1024}')
#用户使用的交换分区容量
swap_user=$(free -m | awk '/Swap/{printf "%.2fG",$3/1024}')
#剩余交换分区容量
swap_free=$(free -m | awk '/Swap/{printf "%.2fG",$4/1024}')
#可用交换分区占比
swap_percentage=$(free -m | awk '/Swap/{printf "%.2f",$4/$2*100}')
#占用内存资源最多的10个进程列表
top_proc_mem=$(ps --no-headers -eo rss,args | sort -k1 -n -r | head -10)
echo -e "\n\033[32m################## 内存 ############\033[0m\n"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|总内存容量:\033[31m $mem_total \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|用户程序内存量:\033[31m $mem_user \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|多进程共享内存量:\033[31m $mem_shared \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|缓存占用内存量:\033[31m $mem_buff_cache \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|空闲内存容量:\033[31m $mem_free \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|剩余可用内存容量:\033[31m $mem_available \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|可用内存百分比:\033[31m $mem_percentage% \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "\033[32m############## 交换分区 #############\033[0m\n"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "总的交换分区容量:\033[31m $swap_total \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|用户使用的交换分区容量:\033[31m $swap_user \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
echo -e "|剩余交换分区容量:\033[31m ${swap_free}"
echo -e "\033[32m------------------------------------\033[0m"
if [ $(free -m | awk '/Swap/{print $2}') -ne 0 ]; then
echo -e "|可用交换分区占比:\033[31m $swap_percentage% \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
fi
echo -e "|占用内存资源最多的10个进程列表:"
echo -e "\033[31m$top_proc_mem% \033[0m"
echo -e "\033[32m------------------------------------\033[0m"
}
CPU相关信息
CPU相关信息包含:
- CPU型号
- CPU内核数量
- CPU最近1/5/15分钟的平均负载
- 当前CPU中断数量
- 当前上下文切换数量
1 | ################## CPU 相关 ############ |
对应的脚本中的函数
1 |
|
磁盘和IO相关信息
磁盘和IO相关信息包括:
- 磁盘总数
- 分区总数
- 磁盘分区信息
- 写入磁盘的总块数
- 从磁盘读出的块数
- 每秒写磁盘块的速率
- 分区挂载信息
对应的脚本中的函数
1 | ################## 磁盘IO 相关 ############ |
1 | function disk_io() { |
进程相关信息
进程相关信息包括:
- 当前进程数量
- 用户的最大进程数
- 内核设置的最大进程数
1 | ################## 进程 相关 ############ |
对应的脚本中的函数
1 | function procs() { |
网络相关信息
网络相关信息包括:
- 本地IP地址列表
- 获取网卡流量信息
- 获取暴露端口信息
1 | ################## 网络 相关 ############ |
对应的脚本中的函数
1 | function network() { |
完整的脚本
1 |
|