LINUX 基於case分支編寫服務指令碼

2021-09-24 03:32:56 字數 4872 閱讀 8713

問題

本案例要求編寫myprog服務指令碼,相關要求如下:

能支援start、stop、restart等控制引數

控制引數通過位置變數$1傳入

能通過chkconfig命令來管理此服務

服務操作為sleep程序的開啟/關閉/重啟

方案case分支屬於匹配執行的方式,它針對指定的變數預先設定乙個可能的取值,判斷該變數的實際取值是否與預設的某乙個值相匹配,如果匹配上了,就執行相應的一組操作,如果沒有任何值能夠匹配,就執行預先設定的預設操作。

case分支的語法結構如下所示:

case  變數值  in

模式1)

命令序列1 ;;

模式2)

命令序列2 ;;

.. ..

*) 預設命令序列

esac

linux系統的服務指令碼預設均位於/etc/init.d/目錄下,基本上都採用了case分支結構來識別控制引數。能夠執行「/etc/init.d/服務名 start」或「service 服務名 start」來啟動對應的服務,是因為對應的指令碼檔案能夠處理「start」這個位置引數。

以network服務指令碼為例,可以看一下它的case結構是怎樣的(此處暫忽略其它無關語句):

[root@svr5 ~]# vim /etc/init.d/network

#! /bin/bash

## network bring up/down networking

## chkconfig: 2345 10 90 //管理引數(自啟的執行級別 開啟順序 關閉順序)

# description: activates/deactivates all network inte***ces configured to \

# start at boot time. //服務描述

.. ..

case "$1" in //檢查執行時的第1個位置引數

start) //若引數是「start」,啟用各種網路裝置及相關程序

.. .. //一系列啟用操作

;;stop) //若引數是「stop」,停用各種網路裝置及相關程序

.. .. //一系列停用操作

;;status) //若引數是「status」,報告網路介面狀態

echo $"configured devices:"

echo lo $inte***ces

echo $"currently active devices:"

echo $(/sbin/ip -o link show up | awk -f ": " '')

;;restart|reload) //若引數是「restart」或「reload」,重啟網路

cd "$cwd"

$0 stop //呼叫本指令碼,通過stop引數先停止服務

$0 start //呼叫本指令碼,通過start引數再啟用服務

;;*) //若引數無法識別,則給出正確的用法幫助,並退出指令碼

echo $"usage: $0 "

exit 1

esac

比如,當嘗試給network指令碼提供check引數時,會提示正確的用法:

[root@svr5 ~]# /etc/init.d/network check

usage:/etc/init.d/network

或者

[root@svr5 ~]# service network check

usage:/etc/init.d/network

步驟

實現此案例需要按照如下步驟進行。

步驟一:任務需求及思路分析

要將myprog作為系統服務,應該將指令碼複製到/etc/init.d/目錄下。若希望通過chkconfig來進行管理,還需要在指令碼開頭新增chkconfig管理引數、服務描述。

服務指令碼通過case分支檢查位置引數 $1 ,根據引數的不同取值做不同操作。

響應start的操作是啟用乙個sleep程序(只是測試嘛,就別加太複雜的語句啦),比如sleep 7200 &可在後台睡眠2小時。

響應stop的操作可簡單使用pkill等命令殺死已啟用的sleep程序。

響應status的操作(可選)則可通過pgrep等命令來檢索sleep程序、報告結果。

響應restart的操作則依次呼叫前面的stop、start即可。

對於其他未知引數,一律提示正確用法。

步驟二:根據實現思路編寫指令碼檔案

指令碼編寫參考如下,其中echo命令的-n選項表示不輸出末尾的換行符:

[root@svr5 ~]# vim /etc/init.d/myprog

#!/bin/bash

# chkconfig: 2345 90 10

# description: startup script for sleep server. (for test only)

case "$1" in

start)

echo -n "正在啟動sleep服務 ... "

if sleep 7200 & //啟動sleep程序,若成功則顯示ok

then

echo "ok"

fi;;

stop)

echo -n "正在停止sleep服務 ... "

pkill "sleep" &> /dev/null && echo "ok" //結束sleep程序

;;status)

if pgrep "sleep" &>/dev/null //檢查sleep程序狀態,報告結果

then

echo "sleep服務已經啟動。"

else

echo "sleep服務已經停止。"

fi;;

restart)

$0 stop //先停止本服務

$0 start //再啟動本服務

;;*) //預設輸出指令碼用法

echo "用法: $0 "

exit 1

esac

[root@svr5 ~]# chmod +x /etc/init.d/myprog

步驟三:驗證、測試指令碼

未提供引數,或提供的引數無法識別時,提示正確用法:

[root@svr5 ~]# /etc/init.d/myprog

用法: /etc/init.d/myprog

[root@svr5 ~]# /etc/init.d/myprog check

用法: /etc/init.d/myprog

通過service呼叫的效果也是相同的:

[root@svr5 ~]# service myprog check

用法: /etc/init.d/myprog

確認可響應status控制引數:

[root@svr5 ~]# service myprog status

sleep服務已經停止。

確認可響應start控制引數,再次檢查服務狀態:

[root@svr5 ~]# service myprog start

正在啟動sleep服務 ... ok

[root@svr5 ~]# service myprog status

sleep服務已經啟動。

確認可響應stop控制引數,再次檢查服務狀態:

[root@svr5 ~]# service myprog stop

正在停止sleep服務 ... ok

[root@svr5 ~]# service myprog status

sleep服務已經停止。

重新啟動myprog服務,再確認可響應restart控制引數:

[root@svr5 ~]# service myprog start

正在啟動sleep服務 ... ok

[root@svr5 ~]# service myprog restart

正在停止sleep服務 ... ok

正在啟動sleep服務 ... ok

[root@svr5 ~]# chkconfig --list myprog

myprog 服務支援 chkconfig,但它在任何級別中都沒有被引用(執行「chkconfig --add myprog」)

執行以下操作將myprog新增為系統服務,並再次檢查自啟狀態:

[root@svr5 ~]# chkconfig --add myprog  				//新增myprog服務

[root@svr5 ~]# chkconfig --list myprog //確認新增結果

myprog 0:關閉 1:關閉 2:啟用 3:啟用 4:啟用 5:啟用 6:關閉

此後,就可以使用chkconfig工具來調整myprog服務的自啟狀態了。比如,以下操作可以將所有自啟關閉:

[root@svr5 ~]# chkconfig myprog off  				//將自啟設為關閉

[root@svr5 ~]# chkconfig --list myprog //確認設定結果

myprog 0:關閉 1:關閉 2:關閉 3:關閉 4:關閉 5:關閉 6:關閉

Shell基於case分支編寫指令碼

本案例要求編寫test.sh指令碼,相關要求如下 能使用redhat fedora控制引數 控制引數通過位置變數 1傳入 當使用者輸入redhat引數,指令碼返回fedora 當使用者輸入fedora引數,指令碼返回redhat 當使用者輸入其他引數,則提示錯誤資訊 case分支屬於匹配執行的方式,...

case分支語句

case分支語句 匹配執行的方式,針對的變數預先存在的值,判斷該變數 實際取值是否和預設的值相匹配,如果匹配,就執行相應的操作 如果不匹配,就執行預先設定好的預設操作 語法結構 case 變數值 in 模式1 命令序列1 模式2 命令序列2 預設命令序列 esac bin bash read p 請...

多分支語句(case)

環境配置 測試指令碼 test.sh pattern 模式 式 格局 樣式 case語法 case 1 in pattern1 語句1 pattern2 語句2 patternn 語句n 例如 root jack31 vim if.sh bin bash test case 1in monitor ...