1. 程式人生 > >Shell應用(5): 自動生成並安裝服務指令碼

Shell應用(5): 自動生成並安裝服務指令碼

指令碼概述
   一般地,當在目標機器編譯安裝某個服務程式後,為了使服務能開機自啟動和關機自停止,則需要將其新增為系統服務。但不同的Linux系統管理服務的方法不同,如Ubuntu使用update-rc.d命令,而RedHat則使用chkconfig命令。因此為了能自動識別系統的型別,減少人工控制,編寫了一個簡單的autosrv指令碼,要求至少1個最多2個引數,特點如下:
   ● 第1個引數只能為install或uninstall,表示安裝或解除安裝服務。
   ● 第2引數是可選的,表示系統名稱,如果沒有指定,那麼會自動識別,若出現提示錯誤,則表示應該要顯式指定系統名稱了。

指令碼實現
  1
#! /bin/bash
  2# autosrv
  3
  4if [ $# -lt 1 ]; then
  5    echo "Usage: $(basename "$0") install | uninstall [sysname]"
  6    exit
  7elif [ "$1" != "install" -a "$1" != "uninstall" ]; then
  8    echo "The first parameter must be install or uninstall" 
  9    exit
 10fi
 11
 12action=$1
 13sysname=$2
 14srv_path=/etc/init.d/srv_name
 15
 16if [ -z "$sysname" ]; then
 17    sysname=`lsb_release -a | sed -n '2p' | awk '{if($0~/[Uu][Bb][Uu][Nn][Tt][Uu]/) print "ubuntu"; else if($0~/[Dd][Ee][Bb][Ii][Aa][Nn]/) print "debian"; else if($0~/[Rr][Ee][Dd][Hh][Aa][Tt]/) print "redhat"; else if($0~/[Cc][Ee][Nn][Tt][Oo][Ss]/) print "centos"; else print ""}'`
 18    if [ -z "$sysname" ]; then
 19        echo "Unknown system, please manual special it with the second parameter"
 20        exit
 21    fi
 22    echo "Current system is $sysname"
 23fi
 24
 25create_file_ubuntu_debian()
 26{
 27cat << END > $srv_path
 28#! /bin/bash
 29. /lib/lsb/init-functions 30
 31END
 32cat srv_name.body >> $srv_path
 33}
 34
 35create_file_redhat_centos()
 36{
 37cat << END > $srv_path
 38#! /bin/bash
 39#chkconfig:2345 90 10 40#description: srv name 41
 42. /etc/rc.d/init.d/functions 43
 44END
 45cat srv_name.body >> $srv_path
 46}
 47
 48chmod_file()
 49{
 50    chmod u+x $srv_path
 51}
 52
 53remove_file()
 54{
 55    rm -f $srv_path
 56}
 57
 58install_ubuntu_debian()
 59{
 60    create_file_ubuntu_debian
 61    chmod_file
 62    update-rc.d srv_name defaults 90 10 63}
 64
 65uninstall_ubuntu_debian()
 66{
 67    update-rc.d -f srv_name remove 68    remove_file
 69}
 70
 71install_redhat_centos()
 72{
 73    create_file_redhat_centos
 74    chmod_file
 75    chkconfig --add srv_name
 76}
 77
 78uninstall_redhat_centos()
 79{
 80    chkconfig --del srv_name
 81    remove_file
 82}
 83
 84case "$sysname" in
 85    ubuntu|debian)
 86    if [ "$action" = "install" ]; then
 87        install_ubuntu_debian
 88    else
 89        uninstall_ubuntu_debian
 90    fi
 91    ;;
 92
 93    redhat|centos)
 94    if [ "$action" = "install" ]; then
 95        install_redhat_centos
 96    else
 97        uninstall_redhat_centos
 98    fi
 99    ;;
100
101    *)
102    echo "Currently only support ubuntu, debian, redhat and centos system"
103    exit
104    ;;
105esac   從上可知,自動識別的方法是獲取lsb_release -a返回的文字再使用awk來匹配ubuntu,redhat,debian,centos這幾個子串(忽略大小寫)。要注意的是,返回的文字可能有所不同。

   當系統安裝了LSB模組時,返回結果如下
   

   沒有安裝時,返回結果如下
   
   無論哪種情況,要提取分析的都是第2行文字,因此使用了sed -n '2p'。srv_name.body是不同系統相同的用於生成最終服務指令碼的部分程式碼檔案,通常包含了start,stop,status,restart幾個函式,只是沒有包含前面的一部分,而這部分則由autosrv指令碼來根據不同的系統生成不同的程式碼。 posted on 2014-01-03 17:11 春秋十二月 閱讀(1274) 評論(1)  編輯 收藏 引用 所屬分類: System