悟懂Linux第24章shell编程-简单脚本实用工具③监测磁盘空间
- 第 24章 编写简单的脚本实用工具
- 24.3 监测磁盘空间
- 24.3.1 需要的功能
- 24.3.2 创建脚本
- 24.3.3 运行脚本
- 24.4 小结
第 24章 编写简单的脚本实用工具
本章内容
自动备份
管理用户账户
监测磁盘空间
Linux系统管理员而言,没什么比编写脚本实用工具更有意义。Linux系统管理员每天对都会有各种各样的任务,从监测磁盘空间到备份重要文件再到管理用户账户。shell脚本实用工具可以让这些工作轻松许多!本章将演示一些可以通过在bash shell中编写脚本工具来实现的功能。
24.3 监测磁盘空间
对多用户Linux系统来说,最大的一个问题就是可用磁盘空间的总量。在有些情况下,比如在文件共享服务器上,磁盘空间很可能会因为一个粗心的用户而被立刻用完。
窍门 如果你的Linux系统应用于生产环境,那么就不能依赖磁盘空间报告来避免服务器的磁盘
空间被填满。应该考虑使用磁盘配额。如果已经安装了quota软件包,可以在shell提示符下输入man –k quota获得有关磁盘限额管理的更多信息。如果没有安装这个软件包,可以使用任何你喜欢的搜索引擎获取进一步的信息。
这个shell脚本工具会帮你找出指定目录中磁盘空间使用量位居前十名的用户。它会生成一个以日期命名的报告,使得磁盘空间使用量可以监测。
24.3.1 需要的功能
你要用到的第一个工具是du命令(参见第4章)。该命令能够显示出单个文件和目录的磁盘使用情况。-s选项用来总结目录一级的整体使用状况。这在计算单个用户使用的总体磁盘空间时很方便。下面的例子是使用du命令总结/home目录下每个用户的$HOME目录的磁盘占用情况。
$ sudo du -s /home/*
[sudo] password for Christine: 4204 /home/Christine
56 /home/Consultant
52 /home/Development
4 /home/NoSuchUser
96 /home/Samantha
36 /home/Timothy
1024 /home/user1
$
-s选项能够很好地处理用户的$HOME目录,但如果我们要查看系统目录(比如/var/log)的磁盘使用情况呢?
$ sudo du -s /var/log/*
4 /var/log/anaconda.ifcfg.log
20 /var/log/anaconda.log
32 /var/log/anaconda.program.log 108 /var/log/anaconda.storage.log 40 /var/log/anaconda.syslog
56 /var/log/anaconda.xlog
116 /var/log/anaconda.yum.log
4392 /var/log/audit
4 /var/log/boot.log
[...]
$
这个列表很快就变得过于琐碎。这里,-S(大写的S)选项能更适合我们的目的,它为每个目录和子目录分别提供了总计信息。这样你就能快速地定位问题的根源。
$ sudo du -S /var/log/
4 /var/log/ppp
4 /var/log/sssd
3020 /var/log/sa
80 /var/log/prelink
4 /var/log/samba/old 4 /var/log/samba
4 /var/log/ntpstats
4 /var/log/cups
4392 /var/log/audit
420 /var/log/gdm
4 /var/log/httpd
152 /var/log/ConsoleKit 2976 /var/log/
$
由于我们感兴趣的是占用磁盘空间最多的目录,所以需要使用sort命令对du产生的输出进行排序(参见第4章)。
$ sudo du -S /var/log/ | sort -rn 4392 /var/log/audit
3020 /var/log/sa
2976 /var/log/
420 /var/log/gdm
152 /var/log/ConsoleKit 80 /var/log/prelink
4 /var/log/sssd
4 /var/log/samba/old 4 /var/log/samba
4 /var/log/ppp
4 /var/log/ntpstats
4 /var/log/httpd
4 /var/log/cups
$
-n选项允许按数字排序。-r选项会先列出最大数字(逆序)。这对于找出占用磁盘空间最多的用户很有用。
sed编辑器可以让这个列表更容易读懂。我们要关注的是磁盘用量的前10名用户,所以当到了第11行时,sed会删除列表的剩余部分。下一步是给列表中的每行加一个行号。第19章演示过如何使用sed的等号命令(=)来加入行号。要让行号和磁盘空间文本位于同一行,可以用N命令将文本行合并在一起,跟我们在第21章中的处理方法一样。所需的sed命令如下。
sed '{11,$D; =}' | sed 'N; s/\n/ /' |
现在可以用gawk命令清理输出了(参见第22章)。sed编辑器的输出会通过管道输出到gawk命令,然后用printf函数打印出来。
gawk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}'
在行号后面,我们加了一个冒号(:),还给输出的每行文本的字段间放了一个制表符。这样就能得到一个格式精致的磁盘空间用量前10名的用户列表。
$ sudo du -S /var/log/ |
> sort -rn |
> sed '{11,$D; =}' |
> sed 'N; s/\n/ /' |
> gawk '{printf $1 ":" "\t" $2 "\t" $3 "\n"}' [sudo] password for Christine:
1: 4396 /var/log/audit
2: 3024 /var/log/sa
3: 2976 /var/log/
4: 420 /var/log/gdm
5: 152 /var/log/ConsoleKit
6: 80 /var/log/prelink
7: 4 /var/log/sssd
8: 4 /var/log/samba/old
9: 4 /var/log/samba
10: 4 /var/log/ppp
$
现在你已经上手啦!下一步就是用这些信息创建脚本。
24.3.2 创建脚本
为了节省时间和精力,这个脚本会为多个指定目录创建报告。我们用一个叫作CHECK_DIRECTORIES的变量来完成这一任务。出于演示的目的,该变量只设置为包含两个目录。
CHECK_DIRECTORIES=" /var/log /home"
脚本使用for循环来对变量中列出的每个目录执行du命令。这个方法用来读取和处理列表中的值(参见第13章)。每次for循环都会遍历变量CHECK_DIRECTORIES中的值列表,它会将列表中的下一个值赋给DIR_CHECK变量。
for DIR_CHECK in $CHECK_DIRECTORIES do
[...]
du -S $DIR_CHECK
[...]
done
为了方便识别,我们用date命令给报告的文件名加个日期戳。脚本用exec命令(参见第15章)将它的输出重定向到加带日期戳的报告文件中。
DATE=$(date '+%m%d%y')
exec > disk_space_$DATE.rpt
为了生成格式精致的报告,这个脚本会用echo命令来输出一些报告标题。
echo "Top Ten Disk Space Usage"
echo "for $CHECK_DIRECTORIES Directories"
现在让我们看一下将这个脚本的各部分组合在一起会是什么样子。
#!/bin/bash
#
# Big_Users - Find big disk space users in various directories
############################################################### # Parameters for Script
#
CHECK_DIRECTORIES=" /var/log /home" #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
现在你已经得到完整的脚本了。这个简单的shell脚本会为你选择的每个目录创建一个包含日期戳的磁盘空间用量前10名的用户报告。
24.3.3 运行脚本
在让Big_Users脚本自动运行之前,你会想手动测试几次,以保证它如你期望的那样运行。如你所知,在测试前必须为脚本文件设置适合的权限。不过在这里我们使用了bash命令,chmod u+x就不需要了。
$ ls -l Big_Users.sh
-rw-r--r--. 1 Christine Christine 910 Sep 3 08:43 Big_Users.sh $
$ sudo bash Big_Users.sh
[sudo] password for Christine:
$
$ ls disk_space*.rpt
disk_space_090314.rpt
$
$ cat disk_space_090314.rpt
Top Ten Disk Space Usage
for /var/log /home Directories
The /var/log Directory:
1: 4496 /var/log/audit
2: 3056 /var/log
3: 3032 /var/log/sa
4: 480 /var/log/gdm
5: 152 /var/log/ConsoleKit 6: 80 /var/log/prelink
7: 4 /var/log/sssd
8: 4 /var/log/samba/old 9: 4 /var/log/samba
10: 4 /var/log/ppp
The /home Directory:
1: 34084 /home/Christine/Documents/temp/reports/archive
2: 14372 /home/Christine/Documents/temp/reports
3: 4440 /home/Timothy/Project__42/log/universe
4: 4440 /home/Timothy/Project_254/Old_Data/revision.56
5: 4440 /home/Christine/Documents/temp/reports/report.txt 6: 3012 /home/Timothy/Project__42/log
7: 3012 /home/Timothy/Project_254/Old_Data/data2039432
8: 2968 /home/Timothy/Project__42/log/answer
9: 2968 /home/Timothy/Project_254/Old_Data/data2039432/answer 10: 2968 /home/Christine/Documents/temp/reports/answer
$
完全没有问题!现在你可以让这个脚本在需要时自动运行了,可以用cron表来实现(参见第16章)。在周一一大早运行这个脚本是个不错的主意。这样你就可以在周一早上一边喝咖啡一边浏览磁盘使用情况周报了。
24.4 小结
本章充分利用了本书介绍的一些shell脚本编程知识来创建Linux实用工具。在负责Linux系统时,不管它是大型多用户系统,还是你自己的系统,都有很多的事情要考虑。与其手动运行命令,不如创建shell脚本工具来替你完成工作。
本章首先带你逐步了解使用shell脚本归档和备份Linux系统上的数据文件。tar命令是归档数据的常用命令。这部分演示了如何在shell脚本中用它来创建归档文件,以及如何在归档目录中管理归档文件。
接下来介绍了使用shell脚本删除用户账户的四个步骤。为脚本中重复的shell代码创建函数会让代码更易于阅读和修改。这个脚本由多个不同的结构化命令组成,例如case和while命令。这部分还介绍了用于cron表脚本和交互式脚本在结构上的差异。
本章最后演示了如何用du命令来确定磁盘空间使用情况。sed和gawk命令用于提取数据中的特定信息。将命令的输出传给sed和gawk来分析数据是shell脚本中的一个常见功能,所以最好知道该怎么做。
接下来还会讲到更多的高级shell脚本,涉及数据库、Web和电子邮件等。
脚本是计算机程序的一种形式,它可以自动执行任务、归档文件、管理用户账户,并监测磁盘空间等。在此小结中,我们将介绍一些常见的脚本实用工具,包括归档、用户账户管理和磁盘空间监测。
一、归档脚本
归档脚本是一种用于将文件或目录压缩成一个归档文件的脚本。归档脚本可以用于备份文件、将文件打包、压缩文件、传输文件等多种用途。我们可以使用以下命令来创建一个归档脚本:
#!/bin/bash
# 压缩目录
tar -czf archive.tar.gz /path/to/directory
在这个脚本中,我们使用了 tar 命令来压缩一个目录。-c 表示创建一个新的归档文件,-z 表示使用 gzip 来压缩文件,-f 表示指定输出文件的名称。/path/to/directory 是要被压缩的目录路径,archive.tar.gz 是归档文件的名称。
二、用户账户管理脚本
用户账户管理脚本是一种可以自动创建、删除和更改用户账户信息的脚本。这个脚本可以用于大型组织、公司或学校,以便为员工、学生或老师管理账户。以下是一个创建用户账户的脚本:
#!/bin/bash
# 输入用户名和密码
read -p 'Enter username: ' USER
read -sp 'Enter password: ' PASSWD
# 创建用户
useradd -m $USER
# 设置用户密码
echo "$USER:$PASSWD" | chpasswd
在这个脚本中,我们使用了 useradd 命令来创建一个新用户。-m 表示在创建用户后创建一个家目录。我们也使用了 chpasswd 命令来设置密码。
三、磁盘空间监测脚本
磁盘空间监测脚本是一种用于检查磁盘使用情况的脚本。它可以检查磁盘使用量是否达到了某个限制,并在达到限制时提醒管理员。
以下是一个检查磁盘使用情况的脚本:
#!/bin/bash
# 默认空间限制为 90%
LIMIT=90
# 检查磁盘空间使用率
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $1}' | while read USED SPACE; do
# 将使用率的百分比符号去除
used=$(echo $USED | sed 's/%//g')
# 如果使用量超出了限制,发出警告
if [ $used -gt $LIMIT ]; then
echo "Disk space on $SPACE is running low. Current usage: $USED%"
fi
done
在这个脚本中,我们使用了 df 命令来获取磁盘空间使用情况。grep -vE ‘^Filesystem|tmpfs|cdrom’ 是为了排除不必要的行。然后我们使用了 awk 命令来提取磁盘使用率和名称。最后,我们用 while 循环来检查每个磁盘使用率是否超出了限制。
综上所述,归档脚本、用户账户管理脚本和磁盘空间监测脚本都是非常有用的脚本实用工具。它们可以帮助管理员更好地管理服务器,并自动执行一些常见的任务。