SysV init 風格的服務自啟動腳本本質是 Shell 腳本,遵循固定結構與 chkconfig 識別規範。以 Tomcat 為例,詳細講解腳本三大區塊、關鍵變量、case 分支結構與部署步驟。
#!/bin/bash
#
# tomcat startup script for the Tomcat server
#
# chkconfig: 345 80 20
# description: start the tomcat daemon
#
# Source function library
. /etc/rc.d/init.d/functions
prog=tomcat
JAVA_HOME=/usr/java/jdk1.6.0_27
export JAVA_HOME
CATALINA_HOME=/usr/local/tomcat
export CATALINA_HOME
case "$1" in
start)
echo "Starting Tomcat..."
$CATALINA_HOME/bin/startup.sh
;;
stop)
echo "Stopping Tomcat..."
$CATALINA_HOME/bin/shutdown.sh
;;
restart)
echo "Stopping Tomcat..."
$CATALINA_HOME/bin/shutdown.sh
sleep 2
echo
echo "Starting Tomcat..."
$CATALINA_HOME/bin/startup.sh
;;
*)
echo "Usage: $prog {start|stop|restart}"
;;
esac
exit 0
#!/bin/bash:指定解釋器。# chkconfig: 345 80 20:必須行,chkconfig 識別依據。345:運行級別 3/4/5 啟動80:啟動優先級 (S80)20:停止優先級 (K20). /etc/rc.d/init.d/functions:當前 Shell 載入函數庫(而非子 Shell),提供 daemon、killproc、success/failure 等通用函數。prog=tomcat:腳本名稱,用於 usage 提示。JAVA_HOME、CATALINA_HOME:關鍵路徑,export 導出使子進程可見。$1:第一個位置參數(start/stop/restart)。;; 結束,* 兜底顯示用法。sleep 2:重啟時等待進程完全停止。exit 0:正常退出碼。# 1. 建立腳本 vim /etc/init.d/tomcat # 貼入內容,修改路徑匹配實際環境 # 2. 賦予執行權限 chmod +x /etc/init.d/tomcat # 3. 註冊到 chkconfig chkconfig --add tomcat chkconfig --level 345 tomcat on # 4. 測試 service tomcat start service tomcat status service tomcat stop service tomcat restart
| 現象 | 原因 | 解決 |
|---|---|---|
| chkconfig --add 報錯 | 缺少 chkconfig 識別行 | 確保腳本前部有 # chkconfig: 345 80 20 |
| service tomcat start 無反應 | 路徑變量錯誤或 startup.sh 無執行權限 | 用 bash -x /etc/init.d/tomcat start 調試 |
| 重啟後端口仍被佔用 | shutdown.sh 未完全停止進程 | 增加 sleep 或在 stop 分支加 kill -9 強制清理 |
| 開機不自啟 | 運行級別不匹配或 chkconfig 未生效 | chkconfig --list tomcat 確認 345 為 on |