例67 监控CPU使用率
要求:写一个监控服务器CPU使用率监控监本
思路:用top -bn1命令,取当前空闲cpu百分比值(只取整数部分),然后用100去减这个数值
#!/bin/bash
while :
do
cpu_i=`top -bn1 | grep 'Cpu(s):'| sed 's/^%//'|awk -F ' +|%' '{print $8}'`
cpu_u=`echo 100-$cpu_i|bc`
if [ $cpu_u -gt 90 ]
then
echo "cpu使用率偏高"
python mail.py 123@qq.com "cpu使用率过高" "`top -bn1`"
fi
sleep 60
done
例68 打印子进程
要求:给出一个进程的PID,打印出该进程下面的子进程以及子进程下面的所有进程(只需要考虑进程的子进程,再往深层次的则不考虑)
要点:ps -elf结果中ppid那一列为父进程PID
#!/bin/bash
ps -elf > /tmp/pid.txt
read -p "Please input a pid: " p
if [ -z "$p" ]
then
echo "你没有输入任何一个PID,请输入一个PID"
exit
fi
if ! grep -qw "$p" /tmp/pid.txt
then
echo "你输入的PID不存在"
exit
fi
get_cpid()
{
p1=$1
ps -elf | awk -v p2=$p1 '$5==p2 {print $4}' > /tmp/$p1.txt
n=`wc -l /tmp/$p1.txt|awk '{print $1}'`
if [ $n -eq 0 ]
then
echo "进程$1下没有子进程"
else
echo "进程$1下的子进程是:"
cat /tmp/$p1.txt
fi
}
get_cpid $p
for c_p in `cat /tmp/$p.txt`
do
get_cpid $c_p
done
例69 lamp增加项目
需求背景:服务器上,跑的lamp环境,上面有很多客户的项目,每个项目就是一个网站。由于客户在不断的增加,每次增加一个客户,就需要配置相应的mysql、ftp、以及httpd。这种工作重复性非常强,所以用脚本实现非常合适。mysql增加的是对应客户项目的数据库、用户、密码。ftp增加的是对应项目的用户、密码(使用vsftpd,虚拟用户模式),httpd就是要增加虚拟主机配置段
要点:
要想理解此题,首先要搞清楚增加mysql库和用户、增加httpd虚拟主机、增加ftp用户的命令,只要能在命令行搞定,那么在脚本中就没有问题。
#!/bin/bash
webdir=/data/wwwroot
ftpuserfile=/root/login
mysql="/usr/local/mysql/bin/mysql -uroot -pjk1hYUcnt6"
httpd_config_f="/usr/local/apache2/conf/extra/httpd-vhosts.conf"
add_mysql_user()
{
mysql_p=`mkpasswd -s 0 -l 12`
echo "$pro $mysql_p" >/tmp/$pro.txt
$mysqlc <<EOF
create database $pro
grant all on $pro.* to "$pro"@'127.0.0.1' identified by "$mysql_p";
EOF
}
add_ftp_user()
{
ftp_p=`mkpasswd -s 0 -l 12 `
echo "$pro" >> $ftpuserfile
echo "$ftp_p" >> $ftpuserfile
db_load -T -t hash -f $ftpuserfile /etc/vsftpd_login.db
cp $ftpudir
sed -i "s/aaa/$pro/" $pro
/etc/init.d/vsftpd restart
}
config_httpd()
{
mkdir $webdir /$dom
chown vsftpd:vsftpd $webdir /$dom
cat >> $httpd_config_f <<EOF
<VirtualHost *:80>
<Directory $webdir/$dom>
ALLowOverried none
Require all granted
</Directory>
</VirtualHost>
EOF
/usr/local/apache2/bin/apachectl graceful
}
read -p "input the project name :" pro
read -p "input the domain: " dom
add_mysql_user
add_ftp_user
config_httpd
例70 简易计算器
题目要求
用shell写一个简单的计算机,可以实现加减乘除运算,假如脚本名字为1.sh执行示例 ./1.sh 1+2
要点:
1.脚本有三个参数,所以第一要判断用户输入的参数个数是否符合要求
2.第一个第三个三处是数字,可以是小数,但不能是负数,第二个参数只能是+、-、*
/,如果是其他也要报错
#!/bin/bash
if [ $# -ne 3 ]
then
echo "你给的参数错误"
exit
fi
if_number()
{
n1=`echo $1|sed 's/[0-9.]//g'`
if [ -n "$n1" ]
then
echo "$1不是数字"
exit
fi
if echo $1|grep -q '^\.'
then
echo "$1参数不合法"
exit
fi
}
if_number $1
if_number $3
case $2 in
+)
echo "$1+$3"|bc
;;
-)
echo "$1-$3"|bc
;;
\*)
echo "$1*$3"|bc
;;
/)
echo "scale=2;$1/$3"|bc
;;
*)
echo "你给出的格式不对,第二个参数只能是+,—,*,/"
exit
;;
esac
例71 判断文件并计算单词
要求:判断所给目录内那些耳机文件目录下没有text.txt文件
有text.txt文件的二级目录,计算出该test.txt文件里面所给出单词的次数
假如脚本名字为1.sh 运行脚本的格式为./1.sh 123 root,其中123为目录名字 ,而root为要计算数量的单词
要点:[-f file]判断是否有某个文件
grep -cw 获取单词个数
#!/bin/bash
if [ $# -ne 2 ]
then
echo "请提供两个参数,第一个参数是目录名字,第二个参数是单词"
exit
fi
cd $1
for f in `ls .`
do
if [ -d $f ]
then
if [ -f $f/test.txt ]
then
n=`grep -cw "$2" $f/test.txt`
echo "$1/$f目录下面有test.txt,该test.txt里面的有$n个$2"
fi
fi
done
例72 打印正方形
要求:交互式脚本,根据提示,需要用户输入一个数字作为参数,最终打印出一个正方形。在这里我们提供一个linux下面的特殊字符□,可以直接打印出来。
例子如果用户输入数字为5,则最终显示效果为
□□□□□
□□□□□
□□□□□
□□□□□
□□□□□
要点:echo -n 不换行
#!/bin/bash
while :
do
read -p "Please input a nuber : " n
n1=`echo $n|sed 's/[0-9]//g'`
if [ -n "$n1" ]
then
echo "$n is not a nuber"
continue
else
break
fi
done
for i in `seq 1 $n`
do
for j in `seq 1 $n`
do
echo -n "□"
done
echo
done