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
补充:综合编程 , 其他综合 ,