psutil模块
psutil(python system and process utilities), 是系统监控及进程管理的且跨平台的系统管理库,实现命令行中类似ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop等等命令的功能。
常用的获取系统性能的命令
- 获取系统的cpu信息
命令 | 作用 |
---|---|
psutil.cpu_count(logical=True) | 查看当前主机逻辑cpu的个数 |
psutil.cpu_percent(per_cpu=True) | 查看当前主机每个cpu占用的内存比 |
测试:
- 获取系统的Mermory信息
命令 | 作用 |
---|---|
psutil.swap_memory() | 查看swap分区的内存信息 |
psutil.virtual_memory() | 查看系统内存的使用情况 |
测试:
- 获取系统的Disk和Network信息
命令 | 作用 |
---|---|
psutil.disk_partitions() | 显示系统硬盘的详细信息 |
- 其他信息
- 用户登录信息
psutil.users() | 显示用户的登录信息 |
---|
- 系统启动的开机时间信息
psutil.boot_time() | 显示用户的开机启动时间 |
---|
测试:
拓展:datetime模块
由于psutil.boot_time()显示的时间不好辨识,则可以导入datetime模块中的datetime类中的方法,将时间转换容易识别的时间, time模块的time.ctime()也可以
prettytable 模块
由于psutil.disk_partitions()的打印结果并不是很友好,可以选择导入from prettytable import Prettytable 类来实现制表的过程
python中文件差异性对比
difflab模块,比较文件的差异
示例:
用哈希加密的方式查看两个文件是否被修改过
项目实例:
1. Linux服务器主机监控脚本(sysinfo)
需求:实现网页版
- 基于psutil模块实现系统信息监控,监控详情如下表
- 基于psutil模块监控服务器的磁盘信息
- 基于psutil模块监控用户登录,详情如下表
实现步骤:
-
创建flask项目
-
修改app.py内容
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def hello_world():
return render_template('host.html') # 初始页默认设置为主机信息模块
@app.route('/host/') # 主机信息模块
def host():
try:
import os
name = os.uname().nodename
system = os.uname().sysname
release = os.uname().release
machine = os.uname().machine
except Exception as e:
import platform
name = platform.uname().node
system = platform.uname().system
release = platform.uname().release
machine = platform.uname().machine
import psutil
from datetime import datetime
now_time = datetime.now()
boot_time = datetime.fromtimestamp(psutil.boot_time())
hours, minutes, seconds = str(now_time - boot_time).split(':')
return render_template('host.html', name=name, system=system, release=release,
machine=machine, now_time=now_time, boot_time=boot_time,
hours=hours, minutes=minutes, seconds=seconds)
@app.route('/disks/') # 磁盘信息模块
def disks():
import psutil
disks = psutil.disk_partitions()
return render_template('disks.html', disks=disks)
@app.route('/users/') #用户信息模块
def users():
try:
import os
hostname = os.uname().nodename
except:
import platform
hostname = platform.uname().node
import psutil
user_all = psutil.users()
return render_template('users.html', hostname=hostname, user_all=user_all)
@app.template_filter("todate") # 过滤器模块
def to_date(time):
from datetime import datetime
dt = datetime.fromtimestamp(time)
return str(dt)
if __name__ == '__main__':
app.run()
templates/host.html
主机信息模块对应的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
{% include 'nav.html' %}
<h1 style="color: darkcyan">系统信息监控</h1>
<table class="table table-striped">
<tr>
<td>主机名</td>
<td>{{ name }}</td>
</tr>
<tr>
<td>内核名称</td>
<td>{{ system }}</td>
</tr>
<tr>
<td>内核版本</td>
<td>{{ release }}</td>
</tr>
<tr>
<td>系统架构</td>
<td>{{ machine }}</td>
</tr><tr>
<td>现在时间</td>
<td>{{ now_time }}</td>
</tr><tr>
<td>开机时间</td>
<td>{{ boot_time }}</td>
</tr><tr>
<td>运行时间</td>
<td>{{ hours }}小时{{ minutes }}分钟{{ seconds }}秒</td>
</tr>
</table>>
</body>
</html>
templates/disks.html
磁盘信息模块对应的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
{% include 'nav.html' %}
<h1 style="color: darkcyan">系统的磁盘信息</h1>
<table class="table table-bordered">
<tr>
<td>设备名称</td>
<td>挂载点</td>
<td>类型</td>
<td>选项</td>
</tr>
{% for disk in disks %}
<tr>
<td>{{ disk.device }}</td>
<td>{{ disk.mountpoint }}</td>
<td>{{ disk.fstype }}</td>
<td>{{ disk.opts }}</td>
</tr>
{% endfor %} }}
</table>>
</body>
</html>
templates/users.html
用户信息模块对应的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
{% include 'nav.html' %}
<h1 style="color: #6559ff">用户信息</h1>
<table class="table table-striped">
<tr>
<td>用户名</td>
<td>终端</td>
<td>主机名</td>
<td>登录时间</td>
</tr>
{% for user in user_all %}
<tr>
<td>{{ user.name }}</td>
<td>{{ user.terminal }}</td>
<td>{{ hostname }}</td>
<td>{{ user.started | todate }}</td>
</tr>
{% endfor %}
</body>
</html>
templates/nav.html
导航栏模块对应的html文件
<nav class="navbar navbar-inverse" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<a class="navbar-brand" href="/host/">Sysinfo
</div>
<div>
<ul class="nav navbar-nav">
<li class="active"><a href="/host/">主机信息</a>
<li><a href="/disks/">磁盘信息</a>
<li><a href="/users/">用户信息</a>
</ul>
</div>
</div>
</nav>
- 测试结果:
2. 基于Python实现链表的创建,使用头插法和尾插法
代码:
class Node(object): # 定义节点类
def __init__(self, value):
self.value = value
self.next = None
class linkedlist(object):
def __init__(self):
self.head = None
self.tail = None
def head_insert(self, n): # 头插法
n = Node(n)
n.next = self.head
self.head = n
def tail_insert(self, n): # 尾插法
n = Node(n)
if not self.tail and not self.head:
self.tail = self.head = n
elif not self.tail and self.head:
cur = self.head
while cur:
self.tail = cur
cur = cur.next
self.tail.next = n
self.tail = n
else:
self.tail.next = n
self.tail = n
def travel(self): # 链表的遍历
cur = self.head
while cur:
print(cur.value)
cur = cur.next
if __name__ == '__main__':
linked_list = linkedlist()
linked_list.head_insert(1)
linked_list.tail_insert(3)
linked_list.tail_insert(4)
linked_list.head_insert(5)
linked_list.tail_insert(6)
linked_list.travel()
运行测试结果: