服务器状态监控
目标#
- 查看服务器状态信息
- 查看服务器上应用进程的状态
- 当服务器状态指标接近危险值时向管理员发送通知
前提#
安装所需的库#
安装 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