文档章节

day25:shell题

芬野de博客
 芬野de博客
发布于 01/22 23:06
字数 1552
阅读 17
收藏 0

1、 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

如果其生产商为AuthenticAMD,就显示其为AMD公司;

如果其生产商为GenuineIntel,就显示其为Intel公司;

否则,就说其为非主流公司。

#!/bin/bash

cpu=`grep '^vendor_id' /proc/cpuinfo |head -1|awk -F ': ' '{print $2}'`
#if [ $cpu == "AuthenticAMD" ]
#then
#   echo "CPU厂商是AMD."
#elif [ $cpu == "GenuineIntel" ]
#then
#   echo "CPU厂商是Intel."
#else
#   echo "CPU厂商是非主流厂商。"
#fi

case $cpu in
  AuthenticAMD)
	echo "CPU厂商是AMD."
  ;;

  GenuineIntel)
	echo "CPU厂商是Intel."
  ;;
  
  *)
	echo "CPU厂商是非主流厂商。"
  ;;
esac

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

#!/bin/bash

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

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

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

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

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

#!/bin/bash
#这个脚本用来实现简易计算器
#日期:2018-12-10

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

 

 

 

 

 

 

 

 

 

 

 

d

© 著作权归作者所有

共有 人打赏支持
芬野de博客
粉丝 16
博文 162
码字总数 279994
作品 0
海淀
程序员
私信 提问
不知道这算不算是Java 的一个Bug?

day25 获得的上周时间的2014年, 但是, day29获得的上周时间是2013年。 这是什么情况?

Mr_Kail
2014/12/29
67
0
Day25 linux shell中的特殊符号与命令

linux shell中的特殊符号 *:代表零个或多个任意字符 ?:只代表一个任意字符,不管是数字还是字母,只要是一个字符,都能匹配出来 #:表注释说明,即后面的内容都会被忽略 如: ****:脱义字...

杉下
2018/07/03
0
0
JavaScript 30天每日效果图

JavaScript 30天每日效果图 在Github上看到了wesbos的一个Javascript30天挑战的repo,旨在使用纯JS来进行练习,不允许使用任何其他的库和框架,该挑战共30天,我会在这里复现这30天遇到的挑战...

黎跃春
2017/07/19
0
0
正则表达式八道练习题

正则表达式八道练习题: Linux:运维正则表达式练习题: 1、显示/etc/passwd文件中以bash结尾的行 2、显示/etc/passwd文件中的两位数或三位数 3、显示命令结果中以‘LISTEN’后跟0个、1个或者...

qd轻描淡写
2017/11/15
0
0
通过Shell开发企业级专业服务启动脚本案例(MySQL)

老男孩教育Linux高端运维班Shell课后必会考试题: 企业Shell面试题10:开发企业级MySQL启动脚本 说明: MySQL启动命令为: /bin/sh mysqldsafe --pid-file=$mysqldpidfilepath 2>&1 >/dev/null...

老男孩oldboy
2017/07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式之路

https://java-design-patterns.com/patterns/ https://www.oodesign.com/ https://www.programering.com/a/MTNxAzMwATY.html https://design-patterns.readthedocs.io/zh_CN/latest/ https:/......

晨猫
今天
1
0
JDK1.8 jar包说明

JDK 1.8 lib:access-bridge-64.jarcharsets.jarcldrdata.jardeploy.jardnsns.jarjaccess.jarjavawa.jarjce.jarjfr.jarjfxrt.jarjfxswt.jarjsse.jarlocaledata.jar......

冷基
今天
1
0
判断用户的icloud是否开启【Swift4.2】

使用icloudkit存储用户私人数据时,必须判断用户的icloud是否开启【Swift4.2】 func isICloudContainerAvailable()-> Bool { if FileManager.default.ubiquityIdentityToken != ni......

叶落花开
今天
2
0
今天的学习

1、执行git add *命令就把改动提交到了暂存区,执行git pull命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]切换分支 2、执行git commit -m '说明' 命令就把改动提...

墨冥
昨天
0
0
Android4.4 及以下TextView,Button等控件使用矢量图报错

1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图,比如android:drawableS...

newtrek
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部