面上有很多關於腳本的書籍和教程,好是好,可寫的越來越像編程書。其中不僅有算法的介紹,比如遞歸,冒泡法,高效,冗余。還伴有非常高深的案例,看的是雲裡霧裡,頭昏腦脹。看完以後感覺如下,書是好書,例子是好例子,算法更是好算法,可多少有些脫離實際,提高的可以,干活的不成。對於沒有任何程序開發基礎的同志來說更是如此。
可那些書就不看了嗎?答案是否定的,這些書上所撰寫的內容雖然晦澀可都是好東西。但攘外必先安內,在看這些書之前,我認為,更重要的應該先要搞清楚系統本身的腳本。作為發行版系統中使用的腳本,肯定都是經典中的經典,除了能夠幫助我們更好的編寫腳本以外,還能使我們理清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