如何查找 Linux 中的文件系统利用率,如果超过一定限制则采取一些措施?

如何查找 Linux 中的文件系统利用率,如果超过一定限制则采取一些措施?

如何计算文件系统利用率系统,即所有驱动器中的可用空间和已用空间。如果任何驱动器超过阈值限制,它应该根据空间使用情况打印前 10 个文件或目录。该限制可以类似于%已用内存。

请帮我为 Linux/AIX 编写一个 bash 脚本。

答案1

检查IBM 知识中心对于所需命令的差异,我想我已经解决了。被告知,我无法在 AIX 中对此进行测试,因此它基于我从上述站点中了解到的 AIX 差异。在标准 GNU/Linux 工具中,在覆盖某些选项之前,它测试得很好。 YMMV。

首先,我们可以获得文件系统的列表,以及每个文件系统使用的百分比,以及文件系统大小(我们无法关闭)和安装点,我们可能需要稍后处理。使用df -F %z %m返回类似于 的内容,这意味着设备 上安装/dev/sda1 1545476 78% /home的 1545476 个块中的 78%正在使用中。/dev/sda1/home

由于我们只需要知道文件系统和挂载点,以便进一步检查它以及使用的百分比(没有“%”符号),因此我们使用sed和修改输出awk。在执行此操作时,我们不妨将 uasge 放在第一位,将名称放在第二位,去掉不代表真实文件系统的行,并获取每个文件系统的挂载点。这将使以后的处理更加容易。最后,我们可以按使用百分比降序对其进行排序,以便最重要的排在前面。这给了我们命令:

df -F %z %m | grep -e '^/dev/[sh]d' | sed 's/%//g' | awk '{print $3" "$1" \""$4"\""}' | sort -rn

一行的最终输出是这样的78 /dev/sda1 /home

现在我们可以使用它作为循环的输入,该循环读取每一行并根据预设(此处设置为 75)根据需要对其进行处理。action_limit将其保存为具有执行权限的 shell 脚本。

#!/bin/bash
action_limit=75;
df -F %z %m \
    | grep -e '^/dev/[sh]d' \
    | sed 's/%//g' \
    | awk '{print $3" "$1" "$4}' \
    | sort -r -n \
    | while read -r pct dsk mnt; do
        if test $action_limit -le $pct; then
            echo "$mnt for $dsk is using ${pct}%";
        fi;
    done

echo既然您知道哪些文件系统符合条件,则需要将行替换为您想要对这些文件系统执行的操作的命令。该echo命令显示需要在何处调用其他命令,并显示可传递给该脚本的信息。并非所有东西都需要使用。很可能只$mnt需要安装点。请注意,$mnt包含目录路径,其中可能包含空格或其他危险的 shell 字符,并且在用作另一个脚本或命令的参数时应用引号引起来。

为了仅按大小列出合格文件系统上的顶级文件/目录,我们不需要创建一个全新的脚本来调用。我们可以简单地在上面添加一个命令,给出修改后的 shell 脚本:

#!/bin/bash
action_limit=75;
top_count=10;
df -F %z %m \
    | grep -e '^/dev/[sh]d' \
    | sed 's/%//g' \
    | awk '{print $3" "$1" "$4}' \
    | sort -r -n \
    | while read -r pct dsk mnt; do
        if test $action_limit -le $pct; then
            echo "$mnt for $dsk is using $pct%";
            du -s -x -m "$mnt"/* | sort -rn | head -$top_count| awk '{SZ=$1;$1="";print "\t"SZ"\t"$0}';
        fi;
    done

输出将按降序排列,依次为满足或超过设置限制的文件系统,action_limit然后是该文件系统上使用最多空间的文件或目录。列出的文件或目录的数量由新变量设置top_count。它们在挂载点下方缩进,以保持整洁和可读,并包括每个文件或目录的总大小(以兆字节为单位)。 (-m控制,并且可以更改-k为千字节或-g千兆字节。兆字节似乎是一个很好的折衷方案。)

最后,您使用了/bash标签,因此所有测试都是在 中完成的bash,并且如果使用了任何特定于 bash 的测试或语法,我没有捕获它们。因此,如果您有其他 shell,请在信任它之前仔细测试它。

相关内容