linux运维初级班shell脚本编程考试及参考答案20110523

linux运维初级班shell脚本编程考试及参考答案20110523

############################################
#《老男孩linux就业培训中心-初级班第七期课前考试
#shell脚本编程实战模拟考试
#date:2011-5-23
#出题人:老男孩
#QQ:31333741 MAIL:[email protected]
#blog: http://oldboy.blog.51cto.com
#psite: http://oldboy.cc(即将开放)
############################################

shell脚本编程实战模拟考试题(上机)
一、考试前准备工作:
1.执行yum install httpd -y 安装httpd。
2.检查安装情况
[[email protected] tmp]# rpm -qa httpd
httpd-2.2.3-45.el5.centos.1
3.启动httpd,并检查
[[email protected] tmp]# /etc/init.d/httpd start
启动 httpd:[确定]
[[email protected] tmp]# netstat -lnt|grep 80 #==>检查端口
tcp        0      0 :::80                       :::*                        LISTEN     
[[email protected] tmp]# ps -ef|grep httpd#==>检查进程
root      4041     1  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4043  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4044  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4045  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4046  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4047  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4048  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4049  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
apache    4050  4041  0 14:24 ?        00:00:00 /usr/sbin/httpd
root      4061  3793  0 14:25 pts/0    00:00:00 grep httpd

二、上机考试要求:
1.开发shell脚本/server/scripts/httpdctl,实现通过脚本httpdctl来控制apache服务的启动,停止,
  重起。启动时命令要求:httpdctl start|stop|restart
  提示:需要将httpdctl路径加到系统全局环境变量里。
参考答案:
[[email protected] scripts]# pwd
/server/scripts

a.if语句实现:
[[email protected] scripts]# cat httpdctl
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
if [ "$1" = "start" ];then
   /etc/init.d/httpd $1 >/dev/null 2>&1
   echo "启动 httpd:[确定]"
elif [ "$1" = "stop" ];then
    /etc/init.d/httpd $1
elif [ "$1" = "restart" ];then
    /etc/init.d/httpd $1 >/dev/null 2>&1
    echo "重起 httpd: [确定]"
else
   echo "用法: $0 {start|stop|restart}"
   exit 1
fi
提示:这个问题用case语句实现效果更佳。 本文因学生还未讲解到case.

[[email protected] scripts]# echo 'export PATH=/server/scripts:$PATH' >>/etc/profile
#===>将httpdctl路径加到系统全局环境变量里。
[[email protected] scripts]# source /etc/profile
#===>使httpdctl路径加到系统全局环境变量生效
[[email protected] scripts]# which httpdctl
/server/scripts/httpdctl
[[email protected] scripts]# httpdctl stop
停止 httpd:[确定]
[[email protected] scripts]# httpdctl start
启动 httpd:[确定]
[[email protected] scripts]# httpdctl restart
重起 httpd: [确定]

linux运维初级班shell脚本编程考试及参考答案20110523


-------------------------------------------------------
b.把相同的路径用变量替换[脚本改进]

[[email protected] scripts]# cat httpdctl
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
HTTPDPATH=/etc/init.d/httpd
if [ "$1" = "start" ];then
   $HTTPDPATH $1 >/dev/null 2>&1
   echo "启动 httpd:[确定]"
elif [ "$1" = "stop" ];then
   $HTTPDPATH $1
elif [ "$1" = "restart" ];then
   $HTTPDPATH $1 >/dev/null 2>&1
   echo "重起 httpd: [确定]"
else
   echo "用法: $0 {start|stop|restart}"
   exit 1
fi
-------------------------------------------------------
c.调用系统函数functions,实现更专业友好的提示[继续脚本改进]

[[email protected] scripts]# cat httpdctl
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
. /etc/init.d/functions
HTTPDPATH=/etc/init.d/httpd
if [ "$1" = "start" ];then
   $HTTPDPATH $1 >/dev/null 2>&1
   action "启动 httpd:" /bin/true
elif [ "$1" = "stop" ];then
   $HTTPDPATH $1
elif [ "$1" = "restart" ];then
   $HTTPDPATH $1 >/dev/null 2>&1
   action "重起 httpd:" /bin/true
else
   echo "用法: $0 {start|stop|restart}"
   exit 1
fi
提示:注意action "启动 httpd:" /bin/true的用法
  
[[email protected] scripts]# httpdctl stop
停止 httpd:[确定]
[[email protected] scripts]# httpdctl start
启动 httpd: [确定]
[[email protected] scripts]# httpdctl restart
重起 httpd: [确定] 

linux运维初级班shell脚本编程考试及参考答案20110523


-------------------------------------------------------
d.case语句实现方式

[[email protected] scripts]# cat httpdctl
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
. /etc/init.d/functions
HTTPDPATH=/etc/init.d/httpd
case "$1" in
  start)
        $HTTPDPATH $1 >/dev/null 2>&1
        action "启动 httpd:" /bin/true
        ;;
  stop)
        $HTTPDPATH $1
        ;;
  restart)
        $HTTPDPATH $1 >/dev/null 2>&1
        action "重起 httpd:" /bin/true
        ;;
  *)
   echo "用法: $0 {start|stop|restart}"
esac

e.更专业的实现方法
[[email protected] scripts]# cat httpdctl
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
[ -f /etc/init.d/functions ] && . /etc/init.d/functions

start() {
        daemon httpd >/dev/null 2>&1
        RETVAL=$?
        action "启动 httpd:" /bin/true
        return $RETVAL
}

stop() {
        killproc httpd >/dev/null 2>&1
        [ $? -eq 0  ] && action "停止 httpd:" /bin/true
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        $0 stop
        $0 start
        ;;
  *)
   echo "usage: $0 {start|stop|restart}"
esac
exit $RETVAL

f.系统自带的才是最好的。
请less /etc/init.d/httpd
要求:请所有同学用中文注释httpd脚本每一行,不会的可以咨询老师。
##############################################################
##############################################################
2.开发shell脚本apachemon,实现通过该脚本定时(每隔5分钟)监控http服务的运行状态,如果未运行则自动
  调用httpdctl启动http服务,并发送mail通知系统管理员。
  注意:监控方法可以为端口、进程、、URL模拟访问方式,或者三种方法综合。
说明:由于截止到目前仅讲了if语句,因此,就请大家用if语句来实现。
考试时间:15分钟

[[email protected] scripts]# cat apachemon
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
. /etc/init.d/functions
HTTPPRONUM=`ps -ef|grep http|grep -v grep|wc -l`
if [ $HTTPPRONUM -lt 1 ];then
   action "httpd is not running" /bin/false
   action "httpd is not running" /bin/false >/tmp/httpd.log
   httpdctl restart >/dev/null 2>&1
    action "httpd is restart" /bin/true
   mail -s "`uname -n`'s httpd restarted at `(date)`" [email protected] </tmp/httpd.log
   exit 1
else
   action "httpd is running" /bin/true
   exit 0
fi
  
[[email protected] scripts]# apachemon
httpd is running [确定]
[[email protected] scripts]# pkill httpd
[[email protected] scripts]# ps -ef|grep http|grep -v grep
[[email protected] scripts]# apachemon
httpd is not running [失败]
httpd is restart [确定]
[[email protected] scripts]# ps -ef|grep http|grep -v grep
root      5845     1  1 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5852  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5853  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5854  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5855  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5856  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5857  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5858  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart
apache    5859  5845  0 15:59 ?        00:00:00 /usr/sbin/httpd -k restart

###脚本改进####
脚本改进测试:
[[email protected] /]# echo oldboytest >/var/www/html/index.htm
[[email protected] /]# wget --quiet --spider http://10.0.0.161/index.htm
[[email protected] /]# echo $?
0
[[email protected] /]# ll index.htm
ls: index.htm: 没有那个文件或目录


[[email protected] scripts]# cat apachemon1
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
. /etc/init.d/functions
#HTTPPRONUM=`ps -ef|grep http|grep -v grep|wc -l`  #=====>这个是基于http方式进行判断
wget --quiet --spider http://10.0.0.161/index.htm  #=====>这个是基于WGET URL方式进行判断
if [ $? -ne 0 ];then
   #action "httpd is not running" /bin/false #=====>正式运行,最好注释掉
   action "httpd is not running" /bin/false >/tmp/httpd.log
   httpdctl restart >/dev/null 2>&1
   action "httpd is restart" /bin/true >>/tmp/httpd.log
   mail -s "`uname -n`'s httpd restarted at `(date)`" [email protected] </tmp/httpd.log
   exit 1
else
   action "httpd is running" /bin/true
   exit 0
fi

真正使用时,有些输出是不需要的就去掉
[[email protected] scripts]# cat apachemon1
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
. /etc/init.d/functions
wget --quiet --spider http://10.0.0.161/index.htm  #=====>这个是基于WGET URL方式进行判断
if [ $? -ne 0 ];then
   action "httpd is not running" /bin/false >/tmp/httpd.log
   httpdctl restart >/dev/null 2>&1
   action "httpd is restart" /bin/true >>/tmp/httpd.log
   mail -s "`uname -n`'s httpd restarted at `(date)`" [email protected] </tmp/httpd.log
   exit 1
fi
提示:请同学们详细总结wget命令,做为下周作业提交。


多条件判断的写法
[[email protected] scripts]# cat apachemon1
#!/bin/sh
#created by oldboy 20110523
#QQ 31333741
. /etc/init.d/functions
HTTPPORTNUM=`netstat -lnt|grep 80|grep -v grep|wc -l`
HTTPPRONUM=`ps -ef|grep http|grep -v grep|wc -l`
wget --quiet --spider http://10.0.0.161/index.htm && RETVAL=$?

if [ $RETVAL -ne 0 ] || [ $HTTPPORTNUM -ne 1 ] || [ $HTTPPRONUM -lt 1 ] ;then
#if [ "$RETVAL" != "0" -o "$HTTPPORTNUM" != "1"  -o  "$HTTPPRONUM" \< "1" ] ;then
#提示:以上是两个if为多条件判断的写法,建议同学们掌握第一个。
   action "httpd is not running" /bin/false
   action "httpd is not running" /bin/false >/tmp/httpd.log
   httpdctl restart >/dev/null 2>&1
    action "httpd is restart" /bin/true
   mail -s "`uname -n`'s httpd restarted at `(date)`" [email protected] </tmp/httpd.log
   exit 1
else
   action "httpd is running" /bin/true
   exit 0
fi
以上为 老男孩 给的课前考试的参考答案,欢迎大家讨论、交流,共同提高进步。
后记:shell编程能力 是衡量linux运维工程师水平的一个重要砝码,因此,必须要掌握它。。

更多相关文章
  • shell脚本编程实战模拟考试题(上机)一.考试前准备工作:1.执行yum install httpd -y 安装httpd.2.检查安装情况[[email protected] tmp]# rpm -qa httpdhttpd-2.2.3-45.el5.centos.13.启动httpd,并检查[root ...
  • linux运维初级班课前综合考试及参考答案20110529
    linux运维初级班课前综合考试及参考答案20110529##########################################################<老男孩linux就业培训中心-初级班第七期课前考试及课上讲解#shell脚本编程实战模拟考试#date:2011-5- ...
  • 学习shell脚本入门后,慢慢要尝试编写一些脚本练练手,在这先简单的学习写个系统内存的监控.1.首先先要确定一下截取一下需要关注的内存使用值,可使用free 命令来操作      free -m 显示一般在监控内存是我们都是截取 第三行(-/+ buffers/cache)的值.确定后可以使用管道线 ...
  • 马哥linux运维初级+中级+高级视频教程教学视频全套下载(近50G)
    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文件系统管理详解之三10_05_脚本编程之八 脚本完成磁盘分区格式化20_01_DNS主从复制及区域传 ...
  • linux运维初级课前随机考试:一.笔试部分:1.开机配置服务自启动的文件路径是?解答:/etc/rc.local2.网卡配置文件的路径解答:/etc/sysconfig/network-scripts/ifcfg-eth03.Client 端DNS文件的路径解答:/etc/resolv.conf ...
  • Linux运维处理及监控脚本[Linux运维之道之脚本案例]Linux日常运维工作一个一个命令搞是一件苦事情,作为新一代IT运维工作者,在工作中不断探索提升效率方法和经验,摸索出不少脚本,减轻日常工作量.脚本的出现后给运维工作带来一扇曙光.以下让我们一起走进Linux脚本的世界,一起分享这份经验.分 ...
  • Linux运维第二阶段(九)shell编程shell编程:一.知识点:1.相关概念:(1)脚本编程#bash -n  SCRIPT_FILE(判断脚本是否有语法错误)#bash -x  SCRIPT_FILE(判断脚本是否有语法错误,并详细列出执行的每一个步骤)#basename /root/sum ...
  • #############################################<老男孩linux就业培训中心-初级班第七期课前考试#date:2011-5-21#出题人:老男孩 #QQ:31333741 MAIL:[email protected]#blog: http:/ ...
一周排行
  • 一.建立一个裸仓库新建文件夹LCK,设置为裸仓库二.建立本地仓库新建本地仓库文件夹,设置为一般仓库三.本地仓库一些自身设置1  设置忽略文件:把文件后缀.ignore复制到文件夹User1中,下载地址:2  本地新建 ...
  • 配置交换机管理地址Switch#config tSwitch(config)#switchname switchSwitch(config)#interface mgmt 0   //配置交换机的管理端口Switch ...
  • Windows字符编码
     编码的发展历史:1.ASCII美国信息交换标准码(ASCII:American Stan ...
  • apache虚拟主机配置文件less zcctest.conf<VirtualHost *:80>    SuexecUserGroup zcctest zcctest    DocumentRoot / ...
  • 一.基本概念      malloc/free: 1.函数原型及说明:       void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败 ...
  • 1.登录过程2. NFS+NIS+AUTOFS >>NFS服务  :RPC远程过程调用 :rpc.nfsd 复制目录共享rpc.mountd 负责用户接入服务端:服务端需开启动态注册端口分配服务:port ...
  • 1024伐木累-老王请客吃晚饭,介绍对象
    工作的时候,面对老板的骚扰,你会如何选择呢?本周,我们一起看了丽姐的过去,知道了她的坚定与 ...
  • 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. gcd(a,b) = gcd(b,a mod b) (不妨设a& ...
  • 最近发现网页程序中有个BUG,就是在input标签输入框中输入完数据后,直接点击“取消” 按钮的时候.出现网页崩死的情况: 经过小主酸菜我,各种方法的尝试后,找到一个初步可以解决的方案,在这里分享给大家: 首先,分析 ...
  •       vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.      用法:      ...