Python中的系统基础信息模块和链表的生成

psutil模块

psutil(python system and process utilities), 是系统监控及进程管理的且跨平台的系统管理库,实现命令行中类似ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop等等命令的功能。

常用的获取系统性能的命令

  1. 获取系统的cpu信息
命令作用
psutil.cpu_count(logical=True)查看当前主机逻辑cpu的个数
psutil.cpu_percent(per_cpu=True)查看当前主机每个cpu占用的内存比

测试:
在这里插入图片描述

  1. 获取系统的Mermory信息
命令作用
psutil.swap_memory()查看swap分区的内存信息
psutil.virtual_memory()查看系统内存的使用情况

测试:
在这里插入图片描述

  1. 获取系统的Disk和Network信息
命令作用
psutil.disk_partitions()显示系统硬盘的详细信息

在这里插入图片描述

  1. 其他信息
  • 用户登录信息
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)

需求:实现网页版

  1. 基于psutil模块实现系统信息监控,监控详情如下表

在这里插入图片描述

  1. 基于psutil模块监控服务器的磁盘信息

在这里插入图片描述

  1. 基于psutil模块监控用户登录,详情如下表

在这里插入图片描述

实现步骤:

  1. 创建flask项目
    在这里插入图片描述

  2. 修改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()
  1. 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>
  1. 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>
  1. 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>
  1. 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>
  1. 测试结果:在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

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()

运行测试结果:在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值