Python 3.x基础实战检查磁盘可用空间
作者:TinyZzh 发布时间:2021-05-11 09:21:25
引言
在 Linux 服务器上,磁盘空间的使用情况是一个非常重要的指标。如果服务器上的磁盘空间不足,可能会导致服务器崩溃,影响网站的正常运行。为了避免这种情况的发生,我们需要定期检查服务器上的磁盘空间,并及时清理不必要的文件。本文将介绍如何使用 Python 3脚本检查 Linux 服务器上的磁盘空间。
使用psutil模块实现
首先,我们需要安装psutil
模块。psutil
是一个跨平台的库,用于获取系统信息,包括磁盘使用情况、CPU使用情况等。我们可以使用以下命令来安装psutil
:
pip3 install psutil
获取磁盘使用情况
我们将使用psutil
模块来获取磁盘使用情况。以下是获取磁盘使用情况的示例代码:
import psutil
# 获取磁盘使用情况
disk_usage = psutil.disk_usage('/')
# 打印磁盘使用情况
print(f"Total: {disk_usage.total / (1024*1024*1024):.2f} GB")
print(f"Used: {disk_usage.used / (1024*1024*1024):.2f} GB")
print(f"Free: {disk_usage.free / (1024*1024*1024):.2f} GB")
在这个示例中,我们使用psutil.disk_usage()
函数来获取磁盘使用情况。该函数需要传递一个参数,即要获取使用情况的磁盘路径。在这个示例中,我们传递了根目录/
作为参数。psutil.disk_usage()
函数返回一个namedtuple
对象,其中包含总容量、已用容量和可用容量等信息。
获取磁盘挂载点
在Linux系统中,磁盘可以挂载到不同的目录下。如果您的系统中有多个磁盘,您可能需要检查每个磁盘的可用空间。以下是获取磁盘挂载点的示例代码:
import psutil
# 获取磁盘挂载点
disk_partitions = psutil.disk_partitions()
# 打印磁盘挂载点
for partition in disk_partitions:
print(f"Device: {partition.device}")
print(f"Mountpoint: {partition.mountpoint}")
print(f"File system type: {partition.fstype}")
print()
在这个示例中,我们使用psutil.disk_partitions()
函数来获取磁盘挂载点。该函数返回一个列表,其中包含每个挂载点的信息,包括设备、挂载点和文件系统类型等。
检查磁盘可用空间
现在我们已经了解了如何获取磁盘使用情况和磁盘挂载点,让我们编写一个脚本来检查磁盘的可用空间。以下是检查磁盘可用空间的示例代码:
import psutil
import os
# 获取磁盘挂载点
disk_partitions = psutil.disk_partitions()
# 遍历每个挂载点
for partition in disk_partitions:
# 获取磁盘使用情况
disk_usage = psutil.disk_usage(partition.mountpoint)
# 计算磁盘可用空间的百分比
free_percent = disk_usage.free / disk_usage.total * 100
# 如果磁盘可用空间小于10%,发送警告邮件
if free_percent < 10:
# 获取主机名
hostname = os.uname()[1]
# 构造邮件内容
subject = f"Disk space warning on {hostname}"
message = f"The disk {partition.device} ({partition.mountpoint}) is running out of space ({free_percent:.2f}% free)."
# 发送邮件
send_email(subject, message)
在这个示例中,我们遍历了每个磁盘挂载点,并使用psutil.disk_usage()
函数获取了每个挂载点的使用情况。然后,我们计算了每个挂载点的可用空间百分比,并检查了是否小于10%。如果是,我们将发送一封警告邮件。
使用 du 命令实现
使用 du 命令检查磁盘空间
du 命令是 Linux 系统中一个非常有用的命令,可以用来查看当前目录或文件的磁盘使用情况。在 Python 3 中,我们可以使用 subprocess 模块来执行 du 命令,并将其输出解析为 Python 对象。
以下是一个简单的 Python 3 脚本,用于检查服务器上特定目录的磁盘使用情况:
import subprocess
def get_directory_size(path):
"""Return the total size of the files in the given directory and subdirectories."""
cmd = ["du", "-sh", path]
result = subprocess.run(cmd, stdout=subprocess.PIPE)
output = result.stdout.decode("utf-8").strip()
size = output.split()[0]
return size
# Example usage:
size = get_directory_size("/var/www/html")
print("Size of /var/www/html: {}".format(size))
在上面的示例中,我们定义了一个名为 get_directory_size
的函数,该函数接受一个路径作为参数,并返回该目录及其子目录中文件的总大小。该函数使用 subprocess.run
函数来执行 du
命令,并将其输出解析为 Python 对象。然后,我们从输出中提取出目录的大小,并将其作为字符串返回。
要使用此函数,只需调用 get_directory_size
并传递要检查的目录的路径即可。在上面的示例中,我们检查了 /var/www/html
目录的大小,并将结果打印到控制台上。
检查多个目录的磁盘空间
如果您需要检查多个目录的磁盘使用情况,可以使用一个简单的循环来遍历目录列表,并调用 get_directory_size
函数来获取每个目录的大小。以下是一个示例脚本,用于检查多个目录的磁盘使用情况:
import subprocess
def get_directory_size(path):
"""Return the total size of the files in the given directory and subdirectories."""
cmd = ["du", "-sh", path]
result = subprocess.run(cmd, stdout=subprocess.PIPE)
output = result.stdout.decode("utf-8").strip()
size = output.split()[0]
return size
# List of directories to check
directories = ["/var/www/html", "/var/log", "/etc"]
# Loop through directories and print their sizes
for directory in directories:
size = get_directory_size(directory)
print("Size of {}: {}".format(directory, size))
在上面的示例中,我们定义了一个名为 directories
的列表,其中包含要检查的目录的路径。然后,我们使用一个简单的循环遍历该列表,并调用 get_directory_size
函数来获取每个目录的大小。
检查磁盘空间使用率
除了检查单个目录或多个目录的磁盘使用情况之外,我们还可以使用 Python 3 来检查整个磁盘的使用情况。以下是一个示例脚本,用于检查磁盘使用率:
import subprocess
def get_disk_usage():
"""Return the disk usage of the root filesystem in percent."""
cmd = ["df", "-h", "/"]
result = subprocess.run(cmd, stdout=subprocess.PIPE)
output = result.stdout.decode("utf-8").strip()
usage = int(output.split("\n")[1].split()[4].replace("%", ""))
return usage
# Example usage:
usage = get_disk_usage()
print("Disk usage: {}%".format(usage))
在上面的示例中,我们定义了一个名为 get_disk_usage
的函数,该函数返回根文件系统的磁盘使用率。该函数使用 subprocess.run
函数来执行 df
命令,并将其输出解析为 Python 对象。然后,我们从输出中提取出磁盘使用率,并将其作为整数返回。
要使用此函数,只需调用 get_disk_usage
并将其结果打印到控制台上即可。
发送邮件
在上面的示例中,我们调用了一个名为send_email()
的函数来发送邮件。这个函数需要进行自定义实现。以下是一个简单的send_email()
函数的示例代码:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email(subject, message):
# 邮件发送者和接收者
sender = 'sender@example.com'
receiver = 'receiver@example.com'
# 邮件主题和内容
msg = MIMEText(message, 'plain', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8')
# 发送邮件
smtp = smtplib.SMTP('smtp.example.com')
smtp.login(sender, 'password')
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
在这个示例中,我们使用smtplib
模块来发送邮件。首先,我们指定了邮件发送者和接收者的地址。然后,我们使用MIMEText
类创建了一个邮件对象,并指定了邮件的主题和内容。最后,我们使用SMTP
类连接到邮件服务器,并使用login()
方法进行身份验证。然后,我们使用sendmail()
方法发送邮件,并使用quit()
方法关闭连接。
结论
在这篇教程中,我们使用Python 3编写了一个脚本来检查Linux服务器的磁盘可用空间。我们使用了psutil
和os
模块来获取磁盘信息,并编写了一个简单的函数来发送警告邮件。这个脚本可以帮助您在磁盘空间不足时及时采取措施,避免系统崩溃。
来源:https://juejin.cn/post/7230984434630492215


猜你喜欢
- jieba 库是优秀的中文分词第三方库,中文文本需要通过分词获得单个的词语1、jieba库安装管理员身份运行cmd窗口输入命令:pip in
- 在讲这个问题之前让我们来先看一段代码: dim sql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_
- 有的时候,可能会遇到表格中出现重复的索引,在操作重复索引的时候可能要注意一些问题。一、判断索引是否重复a、Series索引重复判断s = S
- 什么是运算符重载让自定义的类生成的对象(实例)能够使用运算符进行操作作用:让自定义的实例像内建对象一样进行运算符操作让程序简洁易读对自定义对
- 一.用SqlConnection连接SQL Server 1..加入命名空间 using System.Data.Sql
- 本文主要介绍 SQLServerExpress2008不用第三方工具调试T-SQL语句,经过本文的介绍,用SQLSERVER2008 Man
- 在JavaScript开发中,被人问到:null与undefined到底有啥区别?一时间不好回答,特别是undefined,因为这涉及到un
- 今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自
- 我相信绝大多数小伙伴在自学python时,运用pycharm进行编写程序时发现字体太小不方便进行编写,通常像codeblocks
- ASCII码键盘ASCII 码键盘ASCII 码键盘ASCII 码键盘27ESC32SPACE33!34"35#36$37%38&
- 写在前面ufunc是universal function的缩写,意思是这些函数能够作用于narray对象的每一个元素上,而不是针对narra
- W3C(万维网联盟)日前发布了HTML 5公共草案,这是10年来对HTML的一次主要升级。据国外媒体报道,W3C HTML5草案于本周二发布
- 一、创建一个线程通过实例化threading.Thread类创建线程import threadingdef func(s):print(s)
- 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可
- 前言随着 Kotlin 1.4 正式发布,关于 SAM 转换的一些问题就可以盖棺定论了。因为这里要讲的都是些旧的东西,所以这是一篇灌水文。K
- 用django开发,经常要处理用户上传的文件, 比如user模型里面如果又个人头像的字段 ImageField等等,而django在Fiel
- 简介单例模式是创建型对象的一种,用于如何优雅的创建对象。让一个类最多产生一个对象。场景只需要一个对象就能解决并且要使用多次的场景,比如框架的
- vue bus总线的使用场景描述A组件中包括B,C组件,而B组件中包括D组件,这时如果D组件想要在A组件中触发C组件的方法怎么办呢?当然方案
- 本文实例讲述了MySQL自定义函数用法。分享给大家供大家参考,具体如下:先来一个简单的,创建一个函数将'2009-06-23 00:
- 本文实例讲述了Python日期时间Time模块。分享给大家供大家参考,具体如下:关于时间和日期模块python程序能用很多方式处理日期和时间