1、写个shell,看看你的linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
注释: 在 Centos 7 里普通用户的UID 是大于1000 。
在 Centos 6 里普通用户的UID 是大于500。
[root@localhost_002 shell100]# cat 16.sh
#!/bin/bash
v=`awk -F 'release ' '{print $2}' /etc/redhat-release |cut -d '.' -f1`
case $v in
7)
uid=`awk -F ':' '$3>1000 {print $3}' /etc/passwd|wc -l`
if [ $uid -eq 0 ]
then
echo "系统没有普通用户;"
else
echo "系统存在普通用户$uid个;"
fi
;;
5|6)
uid=`awk -F ':' '$3>500 {print $3}' /etc/passwd|wc -l`
if [ $uid -eq 0 ]
then
echo "系统没有普通用户;"
else
echo "系统存在普通用户$uid个;"
fi
;;
*)
echo "The is bucunzai"
;;
esac
注释:如上:有一部分内容if那一段代码是重复的,可以写成函数的形式;然后在 case 下掉调用即可;
user(){
if [ $1 -eq 0 ]
then
echo "系统没有普通用户"
else
echo "系统存在普通用户$1"
fi
}
case $v in
5|6)
n=`awk -F ':' '$3>=500' /etc/passwd|wc -l`
user $n
............
这样调用即可;
2、写一个脚本检测磁盘的使用量;检测所有磁盘分区使用率和inode使用率并记录到以当天日期为命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己。
注意:难点在与如何区别是磁盘分区使用率还是inode使用率,然后分别告警,可使用打标记的方式;
查看磁盘的命令 df -h 查看inode 命令 df -i
如何过滤分区大于%85的分区;首先用 sed 删除第一行, 然后使用awk来过滤,大于 $5 即利用率大于 85; 要打印 $7 后面是空格;
df |sed '1d' |awk -F ' +|%' '$5>85 {print $7}'
df -i |sed '1d' |awk -F ' +|%' '$5>85 {print $7}'
[root@localhost_002 shell100]# cat 17.1.sh
#!/bin/bash
LANG=en.UTF-8
dir=/tmp/disk
d=`date +%F`
mail=123@123.com
[ -d $dir ] || mkdir $dir
df >> $dir/$d.log
df -i >> $dir/$d.log
df|sed '1d' |awk -F ' +|%' '$5>=30 {print $7}' > $dir/df.tmp
df -i|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df_i.tmp
n1=`wc -l $dir/df.tmp|awk '{print $1}'`
n2=`wc -l $dir/df_i.tmp|awk '{print $1}'`
tag=0
if [ $n1 -gt 0 ]
then
if [ $n2 -gt 0 ]
then
tag=11
else
tag=10
fi
else
if [ $n2 -gt 0 ]
then
tag=01
else
tag=00
fi
fi
case $tag in
11)
python mail.py $mail "磁盘空间和inode使用率高于85%" "`cat $dir/df.tmp $dir/df_i.tmp|xargs`"
;;
10)
python mail.py $mail "磁盘空间使用率高于85%" "`cat $dir/df.tmp|xargs`"
;;
01)
python mail.py $mail "磁盘inode使用率高于85%" "`cat $dir/df_i.tmp|xargs`"
;;
*)
;;
esac
3、有一台服务器作为web应用,有一个目录(/data/web/new)不定时地会被用户上传新的文件,但是不知道什么时候会上传。所以,需要我们每5分钟做一次检测是否有新文件生成。写成 cron 形式:
请写一个shell脚本去完成检测。检测完成后若是有新文件,还需要将新文件的列表输出到一个按年、月、日、时、分为的日志里(date +%Y%m%d%H%M)
难点:每5分钟检测一次, 可以使用 find 命令来查找五分钟内有更新的文件;
[root@localhost_002 shell100]# cat 18.sh
#!/bin/bash
basedir=/data/web/new
t=`date +%Y%m%d%H%M`
find $basedir -type f -mmin -5 > /tmp/file.list
n=`wc -l /tmp/file.list|awk '{print $1}'`
if [ $n -ge 0 ]
then
mv /tmp/file.list /tmp/$t.list
fi
4、写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10。
cat ./.bash_history|sort |uniq -c |sort -nr|head
[root@localhost_002 ~]# cat ./.bash_history|sort |uniq -c |sort -nr|head
64 ls
13 fg
12 date
8 vim 9.sh
8 vim 17.sh
8 sh 9.sh
7 vim 14.sh
7 sh 14.sh
7 ls /root/txt/
7 echo $time
5、假如需要每小时都去执行一个脚本。在脚本中实现这样的功能,当时间是0点和12点时,需要将目录/data/log/下的文件全部清空,
注意只能清空文件内容而不能删除文件。而其他时间只需要统计一下每个文件的大小,一个文件一行,输出到目录/tmp/log/按日期和时间为名字的日志里。
需要考虑/data/log/目录下的二级、三级、… 等子目录里面的文件。
[root@localhost_002 shell100]# cat 20.sh
#!/bin/bash
dir=/tmp/log
t=`date +%d%H`
t1=`date +%H`
logdir=/data/log
[ -d $dir ] || mkdir $dir
[ -f $dir/$t.log ] && rm -f $dir/$t.log
if [ $t1 == "00" -o $t1 == "12" ]
then
for f in `find $logdir/ type f`
do
> $f
done
else
for f in `find $logdir/ -type f`
do
du -sh $f >> $dir/$t.log
done
fi
注释:本地的难点在与如何区分 0 点和 12 点,那么如何表示00和12点呢;通过date命令;然后用if 来判断; 变量t1
[root@localhost_002 log_stat]# date -d '-20 hour' +%H
00
[root@localhost_002 log_stat]# date -d '+40 hour' +%H
12
首先需要定义一个日记的目录/date/log,然后再定义一个日期的变量 t 为日记名,自定义 日和小时即可 date +%d%H
然后判断下这个要输入的目录tmp/log/是否存在,不存在则创建; [ -d $dir ] || mkdir $dir
统计的时候如何存在则需要删除一下; [ -f $dir/$t.log ] && rm -fr $dir/$t.log
然后下面就是判断了:
if [ $t1 == "00" -o $t1 == "12" ]
then #如果存在;
for f in `find $logdir -type f`
do
> $f
done
else #如果不存在;
for f in `find $logdir -type f`
do
du -sh $f > $dir/$t.log
done
fi