問題
本案例要求編寫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 ...