shell习题-25
题目要求
用shell写一个监控服务器cpu使用率的监控脚本。 参考答案#!/bin/bash #这个脚本用来计算CPU使用率 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-10 [email?protected] 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,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑) 参考答案#可以是用pstree命令查看子进程 #!/bin/bash #这个脚本用来打印子进程 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-10 #将子进程写入到pid文件中 ps -elf > /tmp/pid.txt read -p "Please input a pid: " p #排查空 if [ -z "$p" ] then echo "你没有输入任何pid,请输入一个pid." exit fi #判断输入的pid是否在进程中 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 题目要求需求背景: 参考答案#!/bin/bash #本脚本的功能是在LAMP环境中增加站点,包括apache配置、FTP增加用户、MySQL增加库和用户 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-10 #网站目录 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 参考答案#!/bin/bash #这个脚本用来实现简易计算器 #作者:猿课-阿铭 www.apelearn.com #日期: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 题目要求
参考答案#!/bin/bash #这个脚本用来判断文件是否存在并计算单词个数 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-11 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 题目要求交互式脚本,根据提示,需要用户输入一个数字作为参数,最终打印出一个正方形。在这里我提供一个linux下面的特殊字符■,可以直接打印出来。 示例: 如果用户输入数字为5,则最终显示的效果为 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ 参考答案#!/bin/bash #这个脚本用来打印正方形 #作者:猿课-阿铭 www.apelearn.com #日期:2018-12-11 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |