歡迎來到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)
    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 

Copyright © Linux教程網 All Rights Reserved