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盘。
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命令提供如下四部分信息:
- 媒体的设备文件名
- 媒体挂载到虚拟目录的挂载点
- 文件系统类型
- 已挂载媒体的访问状态
mount -t type device directory
type参数指定了磁盘被格式化的文件系统类型。Linux可以识别非常多的文件系统类型。如果是和Windows PC公用这些存储设备,通常得使用下列文件系统类型。
- vfat:Windows长文件系统。
- ntfs:Windows NT、XP、Vista以及Windows 7中广泛使用的高级文件系统。
- iso9660:标准CD-ROM文件系统。
参数 | 描述 |
-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命令
二、使用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:~$
- 设备的设备文件位置;
- 能容纳多少个1024字节大小的块;
- 已用了多少个1024字节大小的块;
- 还有多少个1024字节大小的块可用;
- 已用空间所占的比例;
- 设备挂载到了哪个挂载点上。
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:~$
三、使用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
- -c:显示所有已列出文件总的大小。
- -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节。
- -s:显示每个输出参数的总计。
以上是关于Shell脚本完成用户磁盘空间监测报告的主要内容,如果未能解决你的问题,请参考以下文章