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