通過Shell開發企業級專業服務啓動腳本案例(MySQL)

老男孩教育Linux高端運維班Shell課後必會考試題:

企業Shell面試題10:開發企業級MySQL啓動腳本

說明:

MySQL啓動命令爲:

/bin/sh mysqld_safe --pid-file=$mysqld_pid_file_path 2>&1 >/dev/null &

停止命令邏輯腳本爲:

mysqld_pid=`cat "$mysqld_pid_file_path"`
if (kill -0 $mysqld_pid 2>/dev/null)
  then
    kill $mysqld_pid
    sleep 2
fi

請完成MySQL啓動腳本的編寫,並實現可以使用chkconfig配置開機自啓動。

要求:用函數,case語句、if語句等實現。


解答:此題的技巧適合絕大多數啓動腳本,例如:rsync,nginx等,僅以MySQL爲例介紹思路。

簡單、易用、高效、專業

#!/bin/bash
# chkconfig: 2345 64 36
# description: MySQL startup
# Author:oldboy
# Blog:http://oldboy.blog.51cto.com
# Time:2017-07-07 09:24:34
# Name:mysqld
# Version:V1.0
# Description:This is a test script.
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
bindir="/application/mysql/bin"
datadir="/application/mysql/data"
mysqld_pid_file_path="/application/mysql/`hostname`.pid"
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin" #此步對開機啓動及定時啓動及其關鍵。
export PATH
return_value=0


# Lock directory.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"

log_success_msg(){ 
    echo " SUCCESS! $@" # 注意函數的縮進,下同,也是專業的表現,可放到functions裏。
}   
log_failure_msg(){     
    echo " ERROR! $@"
}  

# Start Func
start(){
    # Start daemon
    echo "Starting MySQL"
    if test -x $bindir/mysqld_safe  # 啓動文件是否可執行。
    then
        $bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path"  >/dev/null &
        return_value=$? # 是否處理好返回值是區別腳本是否專業規範的關鍵。
        sleep 2

        # Make lock for CentOS
        if test -w "$lockdir"   # 鎖目錄是否可寫。
        then
            touch "$lock_file_path"  # 創建鎖文件。
        fi
        exit $return_value
    else
        log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
    fi
}
# Stop Func
stop(){
    if test -s "$mysqld_pid_file_path" # 是否PID文件存在並大小大於0。
    then
        mysqld_pid=`cat "$mysqld_pid_file_path"`

        if (kill -0 $mysqld_pid 2>/dev/null) # 檢查PID對應的進程是否存在。
        then
            echo "Shutting down MySQL"
            kill $mysqld_pid  # 不能帶-9,否則後果自負。
            return_value=$?
            sleep 2
        else
            log_failure_msg "MySQL server process #$mysqld_pid is not running!"
            rm -f "$mysqld_pid_file_path"
        fi
        # Delete lock for Oldboy's CentOS
        if test -f "$lock_file_path"
        then
            rm -f "$lock_file_path"
        fi
        exit $return_value
    else
        log_failure_msg "MySQL server PID file could not be found!"
    fi
}
case "$1" in
    start)            
        start
        ;;
    stop)
        stop
        ;;
    restart)
        if $0 stop; then
           $0 start
        else
           log_failure_msg "Failed to stop running server, so refusing to try to start."
           exit 1
        fi
        ;;

    *)
        echo "Usage: $0  {start|stop|restart}"
        exit 1
esac
exit $return_value #是否處理好返回值是區別腳本是否專業規範的關鍵。

更多Shell知識可參考老男孩的新書《跟老男孩學Linux運維:Shell編程實戰》,各大書店有售

https://item.jd.com/12117874.html

wKiom1le9rrDj6u4AAFVi8WAzKU935.png


不妨先定個小目標,精通Shell編程!如果精通了,則15K起,可聯繫老男孩給你推薦企業。


有精力的朋友可以寫下rsync或nginx啓動腳本模仿下,可以評論在下面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章