歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

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)atch

 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

後面還會逐一的分析init.d下的腳本,之所以先拿出httpd腳本做分析,是因為httpd腳本可以算是眾多腳本中比較具有代表性的,也是互聯網應用中比較常用的,大家在也能參照他為源碼包安裝的apache做啟動,所以就讓他為後面將要分析的其他腳本做個開場吧。

本文出自 “林肯” 博客,請務必保留此出處http://president.blog.51cto.com/4990508/864189

Copyright © Linux教程網 All Rights Reserved