shell 练习题-06

发布于 2018-05-22  276 次阅读


01

题目:

写个 shell,看看你的 Linux 系统中是否有自定义用户(普通用户),若是有,一共有几个?

假设所有普通用户都是 uid 大于等于 1000

脚本:

#!/bin/bash

m=/etc/passwd

n=`awk -F ':' '$3>=1000 {print $3}' $m | wc -l`

#m 定义了记录用户信息的文件路径,n 截取出第三列大于等于 1000 的行并做统计

if [ $n -gt 0 ]

then

    echo $n

else

    echo none

fi

#判断函数 n 是否大于 0,大于 0 的话就输出 n,反之则输出 none

02

题目:

写一个 shell 脚本,检测所有磁盘分区使用率和 inode 使用率并记录到以当天日期为命名的日志文件里,当发现某个分区容量或者 inode 使用量大于 85%时,发邮件通知你自己。

思路:就是先 df -h 然后过滤出已使用的那一列,然后再想办法过滤出百分比的整数部分,然后和 85 去比较,同理,inode 也是一样的思路。

脚本:

#!/bin/bash

LANG=en

#为了防止 BUG 的产生,先定义 LANG 为英文

log=/tmp/disk/`date +%F`.log

#定义 log 的保存路径和名称

mail=runfali@outlookcom

#定义收件箱

mail_f=/usr/local/sbin/mail.py

#定义发邮件脚本的存放路径

[ -d /tmp/disk ] || mkdir /tmp/disk

#判断/tmp/disk 是否为目录,不是的话就创建这个目录

date +"%F-%T" >> $log

df -h >> $log

df -i >> $log

#分别把当前时间,磁盘空间状况,磁盘 inode 状况追加到 log 文件中

tag1=0

tag2=0

#定义 tag1 和 tag2 的初始值

for i in `df -h | grep -v 'Use' | awk -F ' +|%' '{print $5}'`

do

    if [ $i -gt 85 ]

    then

        tag1=1

    fi

done

#判断磁盘空间使用率是否大于 85%,是的话就定义 tag1 为 1

for i in `df -i | grep -v 'Use' | awk -F ' +|%' '{print $5}'`

do

    if [ $i -gt 85 ]

    then

        tag2=1

    fi

done

#判断磁盘 inode 使用率是否大于 85%,是的话就定义 tag2 为 1

if [ $tag1 -eq 1 ]

then

    if [ $tag2 -ne 1 ]

    then

        tag=1

    else

        tag=3

    fi

fi

#若 tag1 等于 1,tag2 不等于 1,就定义 tag 为 1

#若 tag1 等于 1,tag2 等于 1,就定义 tag 为 3

if [ $tag1 -ne 1 ]

then

    if [ $tag2 -eq 1 ]

    then

        tag=2

    else

        tag=0

    fi

fi

#若 tag1 不等于 1,tag2 等于 1,就定义 tag 为 2

#若 tag1 不等于 1,tag2 不等于 1,就定义 tag 为 0

case $tag in

1)

    python $mail_f $mail "disk space" "`df -h`"

    ;;

2)

    python $mail_f $mail "disk inode" "`df -i`"

    ;;

3)

    python $mail_f $mail "disk space and disk inode" "`df -h;df -i`"

    ;;

0)

    echo "do nothing."

    ;;

esac

#这里则根据以上的判断所获取到的 tag 的值来输出对应内容

03

题目:

有一台服务器作为 web 应用,有一个目录(/data/web/attachment)不定时地会被用户上传新的文件,但是不知道什么时候会上传。所以,需要我们每 5 分钟做一次检测是否有新文件生成。

请写一个 shell 脚本去完成检测。检测完成后若是有新文件,还需要将新文件的列表输出到一个按年、月、日、时、分为名字的日志里。请不要想的太复杂,核心命令只有一个 find /data/web/attachment -mmin -5

思路:每 5 分钟检测一次,那肯定需要有一个计划任务,每 5 分钟去执行一次。脚本检测的时候,就是使用 find 命令查找 5 分钟内有过更新的文件,若是有更新,那这个命令会输出东西,否则是没有输出的。固,我们可以把输出结果的行数作为比较对象,看看它是否大于 0。

脚本:

#!/bin/bash

d=`date -d "-5 min" +%Y%m%d%H%M`

#定义变量 d 为当前时间,时间格式为年月日时分

dir=/data/web/attachment

file=/tmp/1.txt

#定义需要检测的目录 dir 和写入的文件 file

find $dir -type f -mmin -5 > $file

#获取 5 分钟内有过更新的文件并把信息输出到 file

n=`wc -l $file`

#统计 file 中信息的数目 n

if [ $n -gt 0 ]

then

    /bin/mv $file $d.log

fi

#判断 n 的值是否大于 0,是的话就把 file 改名为以年月日时分命名的文件