shell训练计划30天之第二十五天

例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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值