Linux Shell Day25

断了今生、忘了曾经 提交于 2019-11-29 20:01:34

67.监控CPU使用率

68.打印子进程

69.给lamp环境增加项目

70.简易计算器

71.判断文件并计算单词

72.打印正方形


监控CPU使用率

题目要求

用shell写一个监控服务器cpu使用率的监控脚本。

核心要点

思路:用top -bn1命令,取当前空闲cpu百分比值(只取整数部分),然后用100取减这个数值

代码

#!/bin/bash

#这个脚本用来计算CPU使用率

mail_user=xxx@xxx.com

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次,需要再次发邮件

        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

}

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

       m_mail cpu

    fi

    sleep 60

done

打印子进程

题目要求

给出一个进程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

给lamp环境增加项目

题目要求

需求背景: 服务器上,跑的lamp环境,上面有很多客户的项目,每个项目就是一个网站。 由于客户在不断增加,每次增加一个客户,就需要配置相应的mysql、ftp以及httpd。这种工作重复性非常强的,所以用脚本实现非常合适。mysql增加的是对应客户项目的数据库、用户、密码,ftp增加的是对应项目的用户、密码(使用vsftpd,虚拟用户模式),httpd就是要增加虚拟主机配置段。

核心要求

要想解此题,首先要搞清楚增加Mysql库和用户、增加httpd虚拟主机、增加ftp用户的命令,只要能在命令行搞定,那么在脚本中就没有问题。

代码

#!/bin/bash

#本脚本的功能是在LAMP环境中增加站点,包括apache配置、FTP增加用户、MySQL增加库和用户

#网站目录

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用户

    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

简易计算器

题目要求

用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2

核心要求

1.脚本有三个参数,所以第一要判断用户输入的参数个数是否符合要求

2.第一个第三个参数是数字,可以是小数,但不能是负数,第二个参数只能是+、-、*、/

如果是其他要报错

代码

#!/bin/bash

#这个脚本用来实现简易计算器

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

判断文件并计算单词


打印正方形

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!