Shell階段04 shell流程之case語句, 服務啟動停止指令碼(rsync, nginx), shell加鎖機制

战斗小人發表於2024-05-21

1.流程控制語句之case語句

case主要作用是對程式的選擇,迴圈等操作

#語法:

case 變數 in
    變數值1)
        命令序列
        ;;    #命令序列結束符
    變數值2)
        命令序列
        ;;
    變數值3)
        命令序列
        ;;
    變數值N)
        命令序列
        ;;
    *)            #不符合上面所有條件
        命令序列
        exit    #或者其他命令
esac

#語法示例
安裝不同PHP的版本
    1. 選單, PHP版本的選單
    2. 提示使用者根據選單進行選擇安裝不同的PHP版本
    3. 根據使用者選擇進行安裝不同的PHP版本

[root@shell01 scripts]# vim case-1.sh
#!/bin/bash
#1.準備PHP的版本選單
cat<<EOF
##########################
1.安裝PHP-5.5版本
2.安裝PHP-5.6版本
3.安裝PHP-7.1版本
4.退出當前安裝
##########################
EOF
#2.提示使用者根據選單進行選擇安裝不同的PHP版本
read -p "請根據上方選單進行選擇安裝不同的PHP版本[1|2|3|4]: " Install
#3.根據使用者的選擇,進行安裝不同的版本
case $Install in
    1)
        echo "你閒著了安裝PHP-5.5版本........."
        echo "正在安裝PHP-5.5版本,請稍後......"
        sleep 3    #等待3秒
        echo "PHP-5.5版本安裝成功............."
        ;;
    2)
        echo "你閒著了安裝PHP-5.6版本........."
        echo "正在安裝PHP-5.6版本,請稍後......"
        sleep 3    #等待3秒
        echo "PHP-5.6版本安裝成功............."
        ;;
    3)
        echo "你閒著了安裝PHP-7.1版本........."
        echo "正在安裝PHP-7.1版本,請稍後......"
        sleep 3    #等待3秒
        echo "PHP-7.1版本安裝成功............."
        ;;
    4)
        echo "你沒有選擇安裝任何PHP版本! 程式退出!"
        exit
        ;;
    *)
        echo "你的選擇不符合要求!請根據上方選單進行選擇[1|2|3|4]."
        exit
esac

2.case語句之場景示例(rsync)

服務啟動停止指令碼

1.編寫一個rsync的啟動停止指令碼
    實現:    start    stop    status    restart
    1.如何啟動rsync
    /usr/bin/rsync --daemon
    2.如何停止rsync
    pkill rsync        #注意: 千萬不要使用rsync作為指令碼的名字
    3.參考系統中其他服務的pid檔案,我們自己建立 #(這裡不是用system管理,無法用system status去檢視)
    
[root@shell01 scripts]# vim case-2.sh
#!/bin/bash
#1.引用函式庫
[ -f /etc/init.d/functions ] && source /etc/init.d/functions || echo "函式庫檔案不存在!"
#2.判斷位置變數的個數是否只有一個
if [ $# -ne 1 ];then
    echo "Usage: $0 {start|stop|status|restart}"
    exit
fi
#3.編寫case語句選項
Pid_File=/var/run/rsync.pid    #這裡啟動不會自動建立pid檔案,需要指令碼自行建立
case $1 in
    start)
        if [ -f $Pid_File ];then
            action "服務Rsync正在執行中......" /bin/true
            exit
        else
            #當服務要啟動的時候,需要手動建立pid檔案
            touch $Pid_File && /usr/bin/rsync --daemon &>/dev/null && sleep 3 #給3秒啟動時間
            if [ $? -eq 0 ];then
                action "服務Rsync啟動成功....." /bin/true
            else
                action "服務Rsync啟動失敗....." /bin/false
            fi
        fi
        ;;
    stop)
        if [ -f $Pid_File ];then
            #當服務在啟動的狀態下,pid檔案是存在的,如果需要停止服務,同樣需要把pid檔案刪除
            rm -f $Pid_File && pkill rsync && sleep 2
            if [ $? -eq 0 ];then
                action "服務Rsync停止成功......" /bin/true
            else
                action "服務Rsync停止失敗......" /bin/false
            fi
        else
            action "服務Rsync不在執行中......" /bin/true
            exit
        fi
        ;;
    status)
        #當pid檔案存在時,則服務在執行中,pid檔案不存在時,服務不在執行中
        if [ -f $Pid_File ];then
            action "服務Rsync正在執行中......" /bin/true
        else
            action "服務Rsync不在執行中......" /bin/true
        fi
        ;;
    restart)
        #重啟,當服務正在執行中,需要停止服務再啟動服務,當服務不在執行中,需要直接啟動
        if [ -f $Pid_File ];then
            #停止服務
            rm -f $Pid_File && pkill rsync && sleep 2
            if [ $? -eq 0 ];then
                action "服務Rsync停止成功......" /bin/true
            else
                action "服務Rsync停止失敗......" /bin/false
            fi
            #啟動服務
            touch $Pid_File && /usr/bin/rsync --daemon &>/dev/null && sleep 3
            if [ $? -eq 0 ];then
                action "服務Rsync啟動成功....." /bin/true
            else
                action "服務Rsync啟動失敗....." /bin/false
            fi
            action "服務Rsync重啟成功...." /bin/true
        else
            action "服務Rsync不在執行中......" /bin/true
            #啟動服務
            touch $Pid_File && /usr/bin/rsync --daemon &>/dev/null && sleep 3
            if [ $? -eq 0 ];then
                action "服務Rsync啟動成功....." /bin/true
            else
                action "服務Rsync啟動失敗....." /bin/false
            fi
            action "服務Rsync重啟成功...." /bin/true
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit
esac

3.Nginx的啟動停止指令碼

start    stop    status      restart        reload

1.怎麼啟動Nginx
/usr/sbin/nginx
2.怎麼停止Nginx
/usr/sbin/nginx -s stop
3.怎麼進行重啟Nginx
先stop 再start
4.怎麼進行平滑重啟Nginx
/usr/sbin/nginx -s reload
5.在什麼情況下,才能進行平滑重啟
    只有在Nginx服務在執行的時候,才能進行平滑重啟。如果Nginx服務沒有在執行中,是不能進行平滑重啟的。
-----------------------------------
[root@shell01 scripts]# vim case-3.sh
#!/bin/bash
#1.引用函式庫
[ -f /etc/init.d/functions ] && source /etc/init.d/functions || echo "函式庫檔案不存在!"
#2.判斷位置變數是否存在且只有一個
if [ $# -ne 1 ];then
    echo "Usage: $0 {start|stop|status|restart|reload}"
    exit
fi
#3.編寫case語句
Pid_File=/var/run/nginx.pid
case $1 in
    start)
        if [ -f $Pid_File ];then
            action "Nginx服務正在執行中......." /bin/true
        else
            /usr/sbin/nginx &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務啟動成功......" /bin/true
            else
                action "Nginx服務啟動失敗......" /bin/false
            fi
        fi
        ;;
    stop)
        if [ -f $Pid_File ];then
            /usr/sbin/nginx -s stop &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務停止成功......" /bin/true
            else
                action "Nginx服務停止失敗......" /bin/false
            fi
        else
            action "Nginx服務不在執行中......" /bin/true
        fi
        ;;
    status)
        if [ -f $Pid_File ];then
            action "Nginx服務正在執行中......" /bin/true
        else
            action "Nginx服務不在執行中......" /bin/true
        fi
        ;;
    restart)
        if [ -f $Pid_File ];then
            #先停止服務
            /usr/sbin/nginx -s stop &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務停止成功...." /bin/true
            else
                action "Nginx服務停止失敗...." /bin/false
            fi
            #啟動服務
            /usr/sbin/nginx &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務啟動成功......" /bin/true
                action "Nginx服務重啟成功......" /bin/true
            else
                action "Nginx服務啟動失敗......" /bin/false
            fi
        else
            action "Nginx服務不在執行中....." /bin/false
            #啟動服務
            /usr/sbin/nginx &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務啟動成功......" /bin/true
                action "Nginx服務重啟成功......" /bin/true
            else
                action "Nginx服務啟動失敗......" /bin/false
            fi
        fi
        ;;
    reload)
        if [ -f $Pid_File ];then
            /usr/sbin/nginx -s reload &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務平滑重啟成功......" /bin/true
            else
                action "Nginx服務平滑重啟失敗......" /bin/false
            fi
        else
            action "Nginx服務沒有在執行中,無法進行平滑重啟...." /bin/false
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|reload}"
        exit
esac
-----------------------------------------

#測試 [root@shell01 scripts]
# sh case-3.sh Usage: case-3.sh {start|stop|status|restart|reload} [root@shell01 scripts]# sh case-3.sh start Nginx服務正在執行中....... [ OK ] [root@shell01 scripts]# sh case-3.sh stop Nginx服務停止成功...... [ OK ]

4.加鎖機制

#加鎖機制
當這個指令碼被某一個人執行的時候,別人是無法執行的,只能等待執行結束之後,才能執行
#最佳化指令碼(透過建立檔案,判斷檔案是否存在來實現鎖的功能)
-----------------------------------------------
[root@shell01 scripts]# vim case-3.sh
#!/bin/bash
#1.引用函式庫
[ -f /etc/init.d/functions ] && source /etc/init.d/functions || echo "函式庫檔案不存在!"
#2.判斷位置變數是否存在且只有一個
if [ $# -ne 1 ];then
    echo "Usage: $0 {start|stop|status|restart|reload}"
    exit
fi
#2.5 進行加鎖機制
Suo_File=/tmp/nginx.lock
if [ -f $Suo_File ];then
    echo "此指令碼$0 正在執行中,請稍後再執行......"
    exit
fi
#2.6 加鎖
touch $Suo_File &>/dev/null
#3.編寫case語句
Pid_File=/var/run/nginx.pid
case $1 in
    start)
        if [ -f $Pid_File ];then
            action "Nginx服務正在執行中......." /bin/true
        else
            /usr/sbin/nginx &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務啟動成功......" /bin/true
            else
                action "Nginx服務啟動失敗......" /bin/false
            fi
        fi
        ;;
    stop)
        if [ -f $Pid_File ];then
            /usr/sbin/nginx -s stop &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務停止成功......" /bin/true
            else
                action "Nginx服務停止失敗......" /bin/false
            fi
        else
            action "Nginx服務不在執行中......" /bin/true
        fi
        ;;
    status)
        if [ -f $Pid_File ];then
            action "Nginx服務正在執行中......" /bin/true
        else
            action "Nginx服務不在執行中......" /bin/true
        fi
        ;;
    restart)
        if [ -f $Pid_File ];then
            #先停止服務
            /usr/sbin/nginx -s stop &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務停止成功...." /bin/true
            else
                action "Nginx服務停止失敗...." /bin/false
            fi
            #啟動服務
            /usr/sbin/nginx &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務啟動成功......" /bin/true
                action "Nginx服務重啟成功......" /bin/true
            else
                action "Nginx服務啟動失敗......" /bin/false
            fi
        else
            action "Nginx服務不在執行中....." /bin/false
            #啟動服務
            /usr/sbin/nginx &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務啟動成功......" /bin/true
                action "Nginx服務重啟成功......" /bin/true
            else
                action "Nginx服務啟動失敗......" /bin/false
            fi
        fi
        ;;
    reload)
        if [ -f $Pid_File ];then
            /usr/sbin/nginx -s reload &>/dev/null && sleep 2
            if [ $? -eq 0 ];then
                action "Nginx服務平滑重啟成功......" /bin/true
            else
                action "Nginx服務平滑重啟失敗......" /bin/false
            fi
        else
            action "Nginx服務沒有在執行中,無法進行平滑重啟...." /bin/false
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|reload}"
        # 這裡刪掉exit
esac
#4.解鎖(上方不要出現exit)
rm -f $Suo_File &>/dev/null
----------------------------------------

#測試
[root@shell01 scripts]# sh case-3.sh stop
Nginx服務停止成功......                                    [  OK  ]
#在另一個視窗同時執行指令碼
[root@shell01 scripts]# sh case-3.sh stop
此指令碼case-3.sh 正在執行中,請稍後再執行......

相關文章