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:/ ...
一周排行
  • epol学习笔记 l  epoll的相关系统调用 epoll_create() epoll_ctl() epoll_wait() l  int epoll_create(int size); 创建一个epoll的句柄 ...
  • 最初的搜索引擎,被认为是一个全文检索系统,而全文检索系统,一般的衡量指标为查全率,查准率,查新率.在发展的过程中逐渐引入半结构化的信息,引入有链接关系,并随着互联网的发展,对衡量指标的顺序也做了一些调整,将查全的重要 ...
  •                打印机维修资料大全问:HP6L的机器纸进到2/3处就出现卡纸了,请问是不是要更换分页器?答:分页器主要是负责单页进纸的,其损坏主要会出现多张进纸的想象,和卡纸的关系不大,可以检查一下下搓 ...
  • 2.文件系统——磁盘分区、查看分区
    一.磁盘分区概述如果想在同一台计算机上安装Windows和Linux两种操作系统,不进行磁 ...
  • 见stackoverflow的一个回答:http://stackoverflow.com/questions/2160454/helloandroidemulator-5554-disconnected-cancel ...
  • 使用于已经存在和新的项目对于已经存在的/root/py[[email protected] py]# lsall*2.py               cltostr.py                 error_rai ...
  • DNS的详细介绍与具体配置
    域名服务(DNS )是一种组织成域层次结构的计算机和网络命名系统.通过DNS服务可以将域名 ...
  • ATL封装IE内核启示:使用Win32/ATL建立窗口
    开发大型GUI界面程序MFC当仁不让,但如果是开发图形应用程序,并不需要大规模界面控件,没 ...
  • 原创大数据时代:基于微软案例数据库数据挖掘知识点总结MicrosoftNaiveBayes算法
    本篇文章主要是继续上两篇Microsoft决策树分析算法和Microsoft聚类分析算法后 ...
  •   应为工作的原因有所接触python,学习过程中找了点有用的东东,分享一下 使用xlrd包,它可以运行在所有的平台上.Windows下载链接:http://download.csdn.net/detail/qian ...