Shell脚本完成用户磁盘空间监测报告

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本完成用户磁盘空间监测报告相关的知识,希望对你有一定的参考价值。

参考技术A     笔者在文章-四种方法查看树莓派CPU温度中,用python查看树莓派温度和状态的程序,其中有一段python程序读取磁盘空间os.popen("df -h /") ,df -h /读取整个磁盘的使用情况。

    这一次笔者在书籍上看到一个脚本,颇具意义。脚本完成磁盘检查,并打印出使用量位居前十位,生成报告rpt。命令 du -hs /root  可以查看目录的整体使用情况,du -hs /root/*可以查看目录一级的整体使用情况,输出统计信息,快速定位问题根源。

    同时关于df与du,df是显示磁盘分区上可以使用的磁盘空间,du是显示已经使用的空间。

    为了找出占用磁盘空间最多的目录,可以使用sort命令来排序,-r是允许数字排序,-n是逆序排序。    

     du -hs /root/* | sort -rn

       sed编辑器可以对输出内容进行赛选,只选择前四行内容,并添加行号。最后使用gawk格式化输出。

du -hs /root/* | sort -rn | sed '5,$D; =' | sed 'N; s/\n/ /' | awk 'printf $1 ":" "\t" $2 "\t" $3 "\n"'

    现在来看看脚本big_users.sh,脚本循环检测CHECK_DIRECTORIES中的目录,然后执行  du -S $DIR_CHECK 打印格式化输出磁盘使用情况。exec命令是打开文件outfilename作为stdout,即输出重定向。

#!/bin/bash

#

# Big_Users - Find big disk space users in various directories

###############################################################

# Parameters for Script

#

CHECK_DIRECTORIES=" /var  /root"  #Directories to check

#

############## Main Script #################################

#

DATE=$(date '+%m%d%y')              #Date for report file

#

exec > disk_space_$DATE.rpt          #Make report file STDOUT

#

echo "Top Ten Disk Space Usage"      #Report header

echo "for $CHECK_DIRECTORIES Directories"

#

for DIR_CHECK in $CHECK_DIRECTORIES  #Loop to du directories

do

  echo ""

  echo "The $DIR_CHECK Directory:"  #Directory header

#

# Create a listing of top ten disk space users in this dir

  du -S $DIR_CHECK 2>/dev/null |

  sort -rn |

  sed '11,$D; =' |

  sed 'N; s/\n/ /' |

  gawk 'printf $1 ":" "\t" $2  "\t" $3 "\n"'

#

done                                #End of loop

#

exit

运行 ./big_users.sh后生成的报告:

Linux Shell之监测磁盘空间

Linux Shell之监测磁盘空间

  系统管理员的另一个重要任务就是监测系统磁盘的使用情况。不管运行的是简单Linux台式机还是大型的Linux服务器,我们都要知道还有多少空间可以留给应用程序。事实上,就算你不是系统管理员,开发人员也好,个人用户也好,你也得知道这些。

一、挂载存储媒体

  Linux文件系统将所有的磁盘都并入一个虚拟目录下。在使用新的存储媒体之前,需要把它放到虚拟目录下。这项工作成为挂载(mounting)。

  在今天的图形化桌面环境里,大多数Linux发行版都能自动挂载特定类型的可移动存储媒体。可移动存储媒体指的是可从PC上轻易移除的媒体,比如CD-ROM、软盘和U盘。

   如果用的发行版不支持自动挂载和卸载可移动存储媒体,就必须手动完成。下面将介绍一些可以帮你管理可移动存储设备的Linux命令行命令。

  1、mount命令

 1 xiaoyu@ubuntu:~$ mount
 2 sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
 3 proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
 4 udev on /dev type devtmpfs (rw,nosuid,relatime,size=1978072k,nr_inodes=494518,mode=755)
 5 devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
 6 tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=401568k,mode=755)
 7 /dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
 8 securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
 9 tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
10 tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
11 tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
12 cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
13 pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
14 cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
15 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
16 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
17 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
18 cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
19 cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
20 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
21 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
22 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
23 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
24 cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
25 systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=21940)
26 mqueue on /dev/mqueue type mqueue (rw,relatime)
27 debugfs on /sys/kernel/debug type debugfs (rw,relatime)
28 hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
29 fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)
30 configfs on /sys/kernel/config type configfs (rw,relatime)
31 vmware-vmblock on /run/vmblock-fuse type fuse.vmware-vmblock (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other)
32 vmhgfs-fuse on /mnt/hgfs type fuse.vmhgfs-fuse (rw,nosuid,nodev,relatime,user_id=0,group_id=0,allow_other)
33 tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=401568k,mode=700,uid=1000,gid=1000)
34 gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000)
35 xiaoyu@ubuntu:~$ 

 

  mount命令提供如下四部分信息:

  •   媒体的设备文件名
  •   媒体挂载到虚拟目录的挂载点
  •   文件系统类型
  •   已挂载媒体的访问状态
  要手动在虚拟目录中挂载设备,需要以root用户身份登录,或是以root用户身份运行sudo命令。下面是手动挂载媒体设备的基本命令:

  mount -t type device directory

  type参数指定了磁盘被格式化的文件系统类型。Linux可以识别非常多的文件系统类型。如果是和Windows PC公用这些存储设备,通常得使用下列文件系统类型。

  •   vfat:Windows长文件系统。
  •   ntfs:Windows NT、XP、Vista以及Windows 7中广泛使用的高级文件系统。
  •   iso9660:标准CD-ROM文件系统。
  大多数U盘和软盘会被格式化成vfat文件系统。而数据CD则必须使用iso9660文件系统类型。
  后面两个参数定义了该存储设备的设备文件的位置以及挂载点在虚拟目录中的位置。比如说,手动将U盘/dev/sdb1挂载到/media/disk,可用下面的命令:
   mount -t vfat /dev/sdb1 /media/disk
 
  媒体设备挂载到了虚拟目录后,root用户就有了对该设备的所有访问权限,而其他用户的访问则会被限制。你可以通过目录权限(将在第7章中介绍)指定用户对设备的访问权限。
  如果要用到mount命令的一些高级功能,表4-5中列出了可用的参数。
参数 描述
-a 挂载/etc/fstab文件中指定的所有文件系统
-f 使mount命令模拟挂载设备,但并不真的挂载
-F 和-a参数一起使用时,会同时挂载所有文件系统
-v 详细模式,将会说明挂载设备的每一步
-I 不启用任何/sbin/mount.filesystem下的文件系统帮助文件
-l 给ext2、ext3或XFS文件系统自动添加文件系统标签
-n 挂载设备,但不注册到/etc/mtab已挂载设备文件中
-p num 进行加密挂载时,从文件描述符num中获得密码短语
-s 忽略该文件系统不支持的挂载选项
-r 将设备挂载为只读的
-w 将设备挂载为可读写的(默认参数)
-L label 将设备按指定的label挂载
-U uuid 将设备按指定的uuid挂载
-O 和-a参数一起使用,限制命令只作用到特定的一组文件系统上
-o 给文件系统添加特定的选项

-o参数允许在挂载文件系统时添加一些以逗号分隔的额外选项。以下为常用的选项

  •   ro:以只读形式挂载。
  •   rw:以读写形式挂载。
  •   user:允许普通用户挂载文件系统。
  •   check=none:挂载文件系统时不进行完整性校验。
  •   loop:挂载一个文件。

  2、umount命令

  从Linux系统上移除一个可移动设备时,不能直接从系统上移除,而应该先卸载。
  Linux上不能直接弹出已挂载的CD。如果你在从光驱中移除CD时遇到麻烦,通常是因为该CD还挂载在虚拟目录里。先卸载它,然后再去尝试弹出。
  umount [directory | device ]
 umount命令支持通过设备文件或者是挂载点来指定要卸载的设备。如果有任何程序正在使用设备上的文件,系统就不会允许你卸载它:
  如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。lsof命令的用法很简单:lsof /path/to/device/node,或者lsof /path/to/mount/point。

二、使用df命令

  有时我们需要知道在某个设备上还有多少磁盘空间。df命令可以让你很方便地查看所有已挂载磁盘的使用情况。
 1 xiaoyu@ubuntu:~$ df
 2 Filesystem     1K-blocks    Used Available Use% Mounted on
 3 udev             1978072       0   1978072   0% /dev
 4 tmpfs             401568    6312    395256   2% /run
 5 /dev/sda1       60809268 5392228  52305004  10% /
 6 tmpfs            2007832   33480   1974352   2% /dev/shm
 7 tmpfs               5120       4      5116   1% /run/lock
 8 tmpfs            2007832       0   2007832   0% /sys/fs/cgroup
 9 vmhgfs-fuse    105417592  163228 105254364   1% /mnt/hgfs
10 tmpfs             401568      60    401508   1% /run/user/1000
11 xiaoyu@ubuntu:~$ 

 

  df命令会显示每个有数据的已挂载文件系统。如你在前例中看到的,有些已挂载设备仅限系统内部使用。命令输出如下:
  •   设备的设备文件位置;
  •   能容纳多少个1024字节大小的块;
  •   已用了多少个1024字节大小的块;
  •   还有多少个1024字节大小的块可用;
  •   已用空间所占的比例;
  •   设备挂载到了哪个挂载点上。
  df命令有一些命令行参数可用,但基本上不会用到。一个常用的参数是-h。它会把输出中的磁盘空间按照用户易读的形式显示,通常用M来替代兆字节,用G替代吉字节。
 1 xiaoyu@ubuntu:~$ df -h
 2 Filesystem      Size  Used Avail Use% Mounted on
 3 udev            1.9G     0  1.9G   0% /dev
 4 tmpfs           393M  6.2M  386M   2% /run
 5 /dev/sda1        58G  5.2G   50G  10% /
 6 tmpfs           2.0G   33M  1.9G   2% /dev/shm
 7 tmpfs           5.0M  4.0K  5.0M   1% /run/lock
 8 tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
 9 vmhgfs-fuse     101G  160M  101G   1% /mnt/hgfs
10 tmpfs           393M   60K  393M   1% /run/user/1000
11 xiaoyu@ubuntu:~$ 

 

  说明  Linux系统后台一直有进程来处理文件或使用文件。df命令的输出值显示的是Linux系统认为的当前值。有可能系统上有运行的进程已经创建或删除了某个文件,但尚未释放文件。这个值是不会算进闲置空间的。

三、使用du命令

  du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可用来快速判断系统上某个目录下是不是有超大文件。默认情况下,du命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况,它会以磁盘块为单位来表明每个文件或目录占用了多大存储空间。对标准大小的目录来说,这个输出会是一个比较长的列表。下面是du命令的部分输出:

 1 xiaoyu@ubuntu:~$ du
 2 4    ./xiaoyu/my_dir
 3 12    ./xiaoyu
 4 4    ./Pictures
 5 4    ./Public
 6 4    ./Documents
 7 352    ./vmware-tools-distrib/doc
 8 64    ./vmware-tools-distrib/installer
 9 180    ./vmware-tools-distrib/vgauth/schemas
10 184    ./vmware-tools-distrib/vgauth
11 7768    ./vmware-tools-distrib/caf/usr/lib/vmware-caf/pme/lib
12 496    ./vmware-tools-distrib/caf/usr/lib/vmware-caf/pme/bin
13 8268    ./vmware-tools-distrib/caf/usr/lib/vmware-caf/pme
14 8272    ./vmware-tools-distrib/caf/usr/lib/vmware-caf
15 8276    ./vmware-tools-distrib/caf/usr/lib
16 8280    ./vmware-tools-distrib/caf/usr
17 72    ./vmware-tools-distrib/caf/etc/vmware-caf/pme/config
18 68    ./vmware-tools-distrib/caf/etc/vmware-caf/pme/scripts
19 92    ./vmware-tools-distrib/caf/etc/vmware-caf/pme/install
20 236    ./vmware-tools-distrib/caf/etc/vmware-caf/pme
21 240    ./vmware-tools-distrib/caf/etc/vmware-caf

 

  每行输出左边的数值是每个文件或目录占用的磁盘块数。注意,这个列表是从目录层级的最底部开始,然后按文件、子目录、目录逐级向上。
  这么用du命令(不加参数,用默认参数)作用并不大。我们更想知道每个文件和目录占用了多大的磁盘空间,但如果还得逐页查找的话就没什么意义了。
  下面是能让du命令用起来更方便的几个命令行参数。
  •   -c:显示所有已列出文件总的大小。
  •   -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节。
  •   -s:显示每个输出参数的总计。

以上是关于Shell脚本完成用户磁盘空间监测报告的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell之监测磁盘空间

自学Linux Shell4.2-监测磁盘空间mount umount df du

创造加了日期的前十名磁盘空间用户报告的脚本

Linux/Unix shell 脚本监控磁盘可用空间

Linux之Shell脚本实战监控系统的磁盘空间使用率

linux shell脚本检测硬盘磁盘空间 邮件报警