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:/ ...
一周排行
  • Postfix邮件处理流程
    文章内容摘自<<Postfix权威指南>>我们追踪一封典型邮件如何 ...
  • inotify+rsync+mutt+msmtp实现linux文件或者目录自动更新并且实现发邮件给管理员
    实现文件实时同步,并且监控目录发送邮件给管理员需求,需要一次性更新多台服务器,人工手动,时 ...
  • Windows 8操作全解[核心提示] 新的 Windows 8 UI 向电脑引入一些新概念,如从边缘轻扫(触控)和移动到角落(鼠标),很多操作用户需要重新学习一下.由于 Windows 8 通过 Charm 菜单/ ...
  • 免费信息发布地 请在下面留言,发布信息. 信息内容可包括:包括招聘信息.推广自己的博客.求职信息等 意在帮助失业的同学,快快找到合适的工作 招人的企业,找到合适的人才  招聘信息格式:招聘职位:XXX公司:XXX地点 ...
  •  公司mongodb服务器调试过程中发现报错如下: su: cannot set user id: Resource temporarily unavailable 经排查是服务器系统单个用户打开进程最大数限制导致. ...
  •  今天上午一位同事的程序遇到一個問題,說是加了很少的一點代碼之後,昨天咝械暮煤玫某绦蚩偸菆箦e,又無法找到錯誤在哪裡,花了他一上午,搞的他很鬱悶,代碼具體是這樣的:NRole = add_honor_timer(NR ...
  • 在生产环境当中,系统管理员经常需要做的事情之一就是备份.以防止在突如其来的灾难当中,能够迅速的恢复系统,把损失减少到最低.今天用一点时间,讲述一下exchange邮件系统的恢复过程. 模拟环境:某日,公司的安装邮件系 ...
  • 查看系统中所有的shell:1.#!/bin/bash2.#               注释3.变量4.控制流程
  • 安装之前,确定你电脑系统位数 1.webstorm 网址:http://www.jetbrains.com/webstorm/ 激活: 主题Theme: Theme主题获取:http://phpstorm-theme ...
  • 首先在网上下载源代码包mysql-5.5.15-linux2.6-i686.tar.gzhttpd-2.2.19.tar.bz2php-5.3.7.tar.bz2mysql源码安装过程---------------- ...