httpd系统自带启动脚本详解


面上有很多关于脚本的书籍和教程,好是好,可写的越来越像编程书。其中不仅有算法的介绍,比如递归,冒泡法,高效,冗余。还伴有非常高深的案例,看的是云里雾里,头昏脑胀。看完以后感觉如下,书是好书,例子是好例子,算法更是好算法,可多少有些脱离实际,提高的可以,干活的不成。对于没有任何程序开发基础的同志来说更是如此。

可那些书就不看了吗?答案是否定的,这些书上所撰写的内容虽然晦涩可都是好东西。但攘外必先安内,在看这些书之前,我认为,更重要的应该先要搞清楚系统本身的脚本。作为发行版系统中使用的脚本,肯定都是经典中的经典,除了能够帮助我们更好的编写脚本以外,还能使我们理清linux系统服务的运行方法,更重要的是,在发生错误的时候可以让我们更快的锁定问题。可谓是一举多得。下面就是对/etc/init.d/httpd脚本的解释,不详之处还望大家谅解,欢迎各位批评指教。

#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#          HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
#以上皆为注释,可以忽略。
. /etc/rc.d/init.d/functions
#"."等价于source,在这里等同于C语言中的include。讲function中函数及变量的定义导入到当前脚本的执行环境中。
if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi
#如果httpd为文件,那么也将其导入到当前脚本执行环境中。

HTTPD_LANG=${HTTPD_LANG-"C"}
#如果变量HTTPD_LANG未定义,那么将其定义为"C",即英文
INITLOG_ARGS=""
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
#定义一系列变量,用于后面的执行。
RETVAL=0
#定义全局命令返回变量
check13 () {
    CONFFILE=/etc/httpd/conf/httpd.conf
    GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|"
    GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|"
    GONE="${GONE}AccessConfig|ResourceConfig)"
    if LANG=C grep -Eiq "^[[:space:]]*($GONE)" $CONFFILE; then
        echo
        echo 1>&2 " Apache 1.3 configuration directives found"
        echo 1>&2 " please read /usr/share/doc/httpd-2.0.52/migration.html"
        failure "Apache 1.3 config directives test"
        echo
        exit 1
    fi
}
#定义check13函数,用于测试配置文件中是否有apache1.3的配置,如果有就显示相应的错误提示并退出脚本。grep -E参数为支持扩展的正则表达式,-i或略大小写,-q静默输出即结果不显示在标准输出中。该函数通过在配置文件中查找GONE变量中用"|"分隔的内容来确认配置文件的正确与否。^[[:space:]]*为正则表达式,代表若干个空格开头。其中[[:space:]]为POSIX字符。
start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        LANG=$HTTPD_LANG daemon $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}
#定义start函数,用于apache的启动。
#如果daemon /usr/sbin/httpd 成功就建立/var/lock/subsys/httpd文件。daemon表示启动一个新的后台进程与nohup相似。/usr/sbin/httpd来源于$httpd变量,变量$OPTIONS来源于/etc/sysconfig/httpd
stop() {
    echo -n $"Stopping $prog: "
    killproc -d 10 $httpd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
#定义stop函数,用于apache的关闭。
#从脚本中可以看到,apache的关闭实际上是通过,killproc -d 10 完成的,并且删除pid文件。
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc $httpd -HUP
        RETVAL=$?
    fi
    echo
}
#定义reload函数,用于apache的重新加载。
#通过/usr/sbin/httpd -t命令对配置文件进行测试,如果出错就显示"not reloading due to configuration syntax error"的错误提示,否则将通过 killproc $httpd -HUP来达到重新加载apache的目的。

case "$1" in #$1表示执行脚本时的第一个参数
  start)
    start #如果参数为start,执行start函数
    ;;
  stop)
    stop #如果参数为stop,执行stop函数
    ;;
  status)#如果参数为status,执行status函数,函数定义在function文件中
        status $httpd
    RETVAL=$?
    ;;
  restart)#如果参数为restart,首先执行stop函数,再执行start函数
    stop
    start
    ;;
  condrestart)#在apache已经运行的情况下,再执行restart操作。
    if [ -f ${pidfile} ] ; then
        stop
        start
    fi
    ;;
  reload)#如果参数为reload,执行reload函数
        reload
    ;;
  *)#如果不符合以上参数,将提示出错信息。
    echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
    exit 1
esac
exit $RETVAL 

相关内容