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:/ ...
一周排行
  • SUID属性passwd命令可以用于更改用户的密码,一般用户可以使用这个命令修改自己的密码.但是保存用户密码的/etc/shadow文件的权限是400,也就是说只有文件的所有者root用户可以写入,那为什么其他用户也 ...
  •  1. 如何加大tomcat连接数在tomcat配置文件server.xml中的<Connector ... />配置中,和连接数相关的参数有: minProcessors:最小空闲连接线程数,用于提高系 ...
  •       刚刚完成了一个伟大的项目, 你是否觉得, 自己却似乎什么也没有获得.前不久刚完成的业务,现在需要重做一份,你是否觉得,几乎没有任何印象.尽管自己有很多熟练的工具,当你需要它们时, 却不知从哪里能够找到它们 ...
  • 为了方便新手学习Linux,本人专门录制了以下Linux初级视频方便学习,本系列多媒体教程已完成的博文:轻松学习Linux之入门篇 http://chenguang.blog.51cto.com/350944/449 ...
  • 1.在三层交换机上增加vlan,配置命令如下:登录交换机设备,通过验证之后.config tvlan 20name meetingrommendconfig tinterface Vlan20description ...
  • Android中利用AIDL机制调用远程服务
    服务端: //CalculateInterface.aidl package com.it ...
  • 一个实现DNS解析体系的项目实验不完全版
    老师布置的一个作业项目案例:以组为单位:1.其中一位同学实现根域服务器,并完成对.com, ...
  • squid中refresh_pattern参数
    refresh_pattern指令在squid配置文件中定义,此参数控制着数据在磁盘上缓存 ...
  • Windows部署服务WDS
    一.安装Windows部署服务(WDS)1.选择"开始-程序-管理工具-服务器管 ...
  • 在依据需求建立好分区表之后,就要实现对分区表的管理维护.主要内容就是两点:1.  利用滑动窗口方案(Sliding Window Scenario),实现分区表与数据移动中间表的互切.2.  分区表本身的结构变更管理 ...