Skip to main content

服务器状态监控

目标#

  • 查看服务器状态信息
  • 查看服务器上应用进程的状态
  • 当服务器状态指标接近危险值时向管理员发送通知

前提#

  • 使用下列 Python 库:
    • psutil:运行中的进程及系统信息取得工具
    • paramiko:一个 SSH 工具,用于在远程服务器上执行命令
  • 使用 Node.js 的 PM2 模块实施应用服务进程管理

安装所需的库#

安装 psutil 库

$ wget "https://pypi.python.org/packages/e2/e1/600326635f97fee89bf8426fef14c5c29f4849c79f68fd79f433d8c1bd96/psutil-5.4.3.tar.gz#md5=3b291833dbea631db9d271aa602a169a"
$ tar -xf psutil-5.4.3.tar.gz
$ cd psutil-5.4.3
$ sudo python3 setup.py install

安装 paramiko 库

$ python3 pip install paramiko

代码示例#

取得系统信息

>>> import psutil
>>> # 取得物理 CPU 个数
>>> psutil.cpu_count(logical=False)
2
>>> # 查看内存使用率(单位:字节)
>>> mem = psutil.virtual_memory()
>>> mem.total,mem.used
(17179869184, 14801498112)

获取进程信息

>>> import psutil
>>> from subprocess import PIPE
>>> p = psutil.Popen([ 'pm2', 'prettylist' ], stdout=PIPE)

运行以下 Python 脚本在远程服务器上执行 PM2 命令,获取运行中的 Node.js 进程信息

import paramiko
import json
app_servers = [
{'hostname': '10.0.1.1', 'username': 'supervisor', 'password': 'password'},
{'hostname': '10.0.1.2', 'username': 'supervisor', 'password': 'password'},
{'hostname': '10.0.1.3', 'username': 'supervisor', 'password': 'password'}
]
app_server_status_template = '------------------------\n'\
+ 'Name : {name:>15}\n'\
+ 'PID : {pid:15d}\n'\
+ 'CPU : {monit[cpu]:15d}\n'\
+ 'RAM : {monit[memory]:15d}\n'\
+ 'Status : {pm2_env[status]:>15}'
# 创建 SSH 客户端
client = paramiko.SSHClient()
# 加载系统已保存的连接过的主机信息
# 若要连接之前未连接过的主机,则需要新建连接 key,详见 https://github.com/paramiko/paramiko
# 否则需要手动连接一次目标服务器,目标服务器信息将自动保存到 ~/.ssh/known_hosts 文件中
client.load_system_host_keys()
# 在指定的服务器上执行 PM2 命令,取得通过 PM2 启动的 Node.js 进程的运行状态
def get_app_server_status(hostname, username, password):
print('========================')
print(hostname)
client.connect(hostname=hostname, username=username, password=password)
stdin, stdout, stderr = client.exec_command('. ~/.bash_profile; pm2 jlist')
result = stdout.read()
result = result.split(b'\n') # 注意:数据是以字节流形式返回的,因此此处字符串需要声明为字节流
result = json.loads(result[len(result) - 1])
for node in result:
print(app_server_status_template.format(**node))
# 取得所有应用服务器上通过 PM2 启动的 Node.js 进程的状态
for app_server in app_servers:
get_app_server_status(**app_server)

上述程序输出结果如下

========================
10.0.1.1
------------------------
Name : demo
PID : 28408
CPU : 0
RAM : 338329600
Status : online
------------------------
Name : demo
PID : 28413
CPU : 1
RAM : 337420288
Status : online
========================
10.0.1.2
------------------------
Name : demo
PID : 28873
CPU : 0
RAM : 344813568
Status : online
------------------------
Name : demo
PID : 28912
CPU : 0
RAM : 363048960
Status : online
========================
10.0.1.3
------------------------
Name : demo
PID : 19293
CPU : 0
RAM : 299618304
Status : online
------------------------
Name : demo
PID : 19280
CPU : 0
RAM : 294944768
Status : online

常用命令示例#

查看 mongod 进程状态

参考链接:mongostat

$ mongostat --authenticationDatabase=dbname --username=username --password=password --host=127.0.0.1 --port=27001 --json --rowcount=1