shell編程實戰16

1. 監控cpu使用率python

#!/bin/bashmysql

mail_user=tzr@qq.comweb

m_mail() {
log=$1
t_s=`date +%s`
t_s2=`date -d "1 hours ago" +%s`
if [ ! -f /tmp/$log ]
then
#建立$log文件
touch /tmp/$log
#增長a權限,只容許追加內容,不容許更改或刪除
chattr +a /tmp/$log
#第一次告警,能夠直接寫入1小時之前的時間戳
echo $t_s2 >> /tmp/$log
fi

#不管$log文件是不是剛剛建立,都須要查看最後一行的時間戳
t_s2=`tail -1 /tmp/$log|awk '{print $1}'`
#取出最後一行即上次告警的時間戳後,當即寫入當前的時間戳
echo $t_s>>/tmp/$log
#取兩次時間戳差值
v=$[$t_s-$t_s2]
#若是差值超過1800,當即發郵件
if [ $v -gt 1800 ]
then
#發郵件,其中$2爲mail函數的第二個參數,這裏爲一個文件
python mail.py $mail_user "CPU使用率超過90%" "`top -bn1`" 2>/dev/null
#定義計數器臨時文件,並寫入0
echo "0" > /tmp/$log.count
else
#若是計數器臨時文件不存在,須要建立並寫入0
if [ ! -f /tmp/$log.count ]
then
echo "0" > /tmp/$log.count
fi
nu=`cat /tmp/$log.count`
#30分鐘內每發生1次告警,計數器加1
nu2=$[$nu+1]
echo $nu2>/tmp/$log.count
#當告警次數超過30次,須要再次發郵件; 1次1分鐘,共30分鐘
if [ $nu2 -gt 30 ]
then
python mail.py $mail_user "CPU使用率超過90%持續30分鐘了" "`top -bn1`" 2>/dev/null
#第二次告警後,將計數器再次從0開始
echo "0" > /tmp/$log.count
fi
fi
}sql

while :
do
cpu_i=`top -bn1 |grep 'Cpu(s):'|sed 's/^%//'|awk -F ' +|%' '{print $8}'`
cpu_u=`echo 100-$cpu_i|bc`apache

if [ $cpu_u -gt 90 ]
then
m_mail cpu
fi
sleep 60
donebash

2. 打印子進程dom

#!/bin/bashide

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

3. 給lamp環境增長項目

#!/bin/bash

#網站目錄
webdir=/data/wwwroot

#ftp的虛擬用戶配置文件目錄
ftpudir=/etc/vsftpd/vuuser

#ftp虛擬用戶密碼文件
ftpuserfile=/root/login

#mysql命令行登陸root
mysqlc="/usr/local/mysql/bin/mysql -uroot -pjk1hYUcnt6"

#apache虛擬主機配置文件
httpd_config_f="/usr/local/apache2/conf/extra/httpd-vhosts.conf"

#定義增長MySQL庫和用戶的函數
add_mysql_user()
{
#生成隨機密碼
mysql_p=`mkpasswd -s 0 -l 12`
#將密碼保存到臨時文件裏,這裏的$pro爲用戶自定義的項目名字
echo "$pro $mysql_p" >/tmp/$pro.txt

#這裏使用嵌入文檔的形式(需頂格),將建立用戶並受權的命令傳遞給mysql
$mysqlc <<EOF
create database $pro;
grant all on $pro.* to "$pro"@'127.0.0.1' identified by "$mysql_p";
#下面這個EOF必需要頂格
EOF
}

#定義增長FTP用戶的函數
add_ftp_user()
{
ftp_p=`mkpasswd -s 0 -l 12`
echo "$pro" >> $ftpuserfile
echo "$ftp_p" >> $ftpuserfile

#將用戶、密碼文件轉換爲密碼db文件
db_load -T -t hash -f $ftpuserfile /etc/vsftpd/vsftpd_login.db

cd $ftpudir
#這裏的aaa是一個文件,是以前的一個項目,能夠做爲配置模板
cp aaa $pro
#把裏面的aaa改成新的項目名字
sed -i "s/aaa/$pro/" $pro

#重啓vsftpd服務
/etc/init.d/vsftpd restart
}

#定義增長apache虛擬主機的函數
config_httpd()
{
#增長網站根目錄,和域名保持一致,這裏的$dom爲用戶自定義的域名
mkdir $webdir/$dom
#將網站根目錄屬主和屬組設置爲ftp用戶;保證ftp用戶有寫權限
chown vsftpd:vsftpd $webdir/$dom

#用嵌入文檔(需頂格),把虛擬主機配置寫入到配置文件裏
cat >> $httpd_config_f <<EOF
<VirtualHost *:80>
DocumentRoot $webdir/$dom
ServerName $dom
<Directory $webdir/$dom>
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
EOF

#重載apache服務
/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

4. 簡易計算器

#!/bin/bash

if [ $# -ne 3 ]
then
echo "你給的參數個數不對,應該給3個參數."
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 "你給出的格式不對,第二個參數只能是+,-,*,/"
;;
esac

5. 判斷文件並計算單詞

#!/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

6. 打印正方形

#!/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

相關文章
相關標籤/搜索