怎樣將shell指令碼自定義為服務

2021-05-24 06:59:29 字數 1526 閱讀 1899

本文告訴你如何將指令碼當成一種系統服務,開機的時候能夠自動執行,關機的時候也能夠自動關閉(非強行關閉)。

chkconfig將發揮巨大威力

linux系統的服務都放/etc/rc.d/init.d目錄下。

但是僅僅把指令碼放在裡面,系統是無法帶起的,必須在/etc/rc.d/rc0.d~rc6.d目錄下分別要建立一些軟鏈結,而且鏈結的名字必須以k或者s打頭,s打頭表示在開機的時候自動給init.d目錄下的指令碼自動傳遞start引數,k打頭就是傳遞stop引數.

對各個執行級的詳細解釋:

0 為停機,機器關閉。

1 為單使用者模式,就像win9x 下的安全模式類似。

2 為多使用者模式,但是沒有nfs 支援。

3 為完整的多使用者模式,是標準的執行級。

4 一般不用,在一些特殊情況下可以用它來做一些事情。

例如在膝上型電腦的電池用盡時,可以切換到這個模式來做一些設定。

5 就是 x11 ,進到 x window 系統了。

6 為重啟,執行 init 6 機器就會重啟。

以上表示/etc/rc.d/rc0.d中的鏈結就是在機器關閉的時候起作用。依次類推。

如果手動去一條條的建立鏈結,那麼效率也太低了。而且容易出錯。(以乙個test指令碼為例)

首先要把test指令碼copy到/etc/init.d目錄下,然後

$ cd /etc/init.d 

$ chkconfig --add test

這樣就會自動新增鏈結了。但是僅靠這條命令怎麼只能在0~6的資料夾下建立k還是s打頭的鏈結呢。

這就需要進一步做處理了,那就是在test指令碼開始部分新增一下**:

#chkconfig: 2345 88 12

注意開始的"#"號不能少。2345就是代表在rc2~5.d目錄下建立s打頭的鏈結。88就是代表在88位啟動test服務。12就是在關機時第12位關閉。也就是在2345中的鏈結名為s88test,0,1,6中鏈結名為k12test。

所以這都是環環相扣的,缺一不可。

但是這麼設定了開機的test指令碼確實可以接受到start引數。但是發現關機的時候卻還是不能接受到stop引數

這是怎麼回事呢?還要進一步做處理。

有沒有發現系統提供的指令碼中的start函式中都有以下這句話:

[ $retval -eq 0 ] && touch /var/lock/subsys/test

系統關閉的過程(發出關閉訊號,呼叫服務自身的程序)中會檢查/var/lock/subsys下的檔案,逐一關閉每個服務,如果某一執行的服務在/var/lock/subsys下沒有相應的選項。
在系統關閉的時候,會像殺死普通程序一樣殺死這個服務。
所以這樣就可以確保在關閉的時候指令碼能夠正常接受到stop引數
再介紹兩條命令:
#刪除服務
$ chkconfig --del test
#檢視服務
$ find  /etc/rc.d -name '*test' -print
怎麼樣,其實很簡單吧?動手試試把。

shell指令碼 使用者自定義變數

顧名思義,使用者自定義,也就是使用者自己定義的變數,在一定的範圍內,你可以隨意定義,而那個範圍就是使用者變數定義格式。變數格式 變數名,由字母或下劃線打頭,不允許數字開頭,後面由字母 數字或下劃線組成,並且大小寫字母意義不同。變數賦值,在 後邊直接指定變數內容是為變數賦值的最基本方法,注意,兩邊沒有...

shell指令碼如何自定義函式

在寫程式時,經常會用到函式,一般開發工具擁有豐富的函式庫。但有時還需要根據自己的需要自定義函式滿足我們的需求。在linux中,寫shell指令碼也一樣,有時會用到自定義函式。函式,最簡單的定義為 將一組命令集或語句形成乙個可用塊,這些塊稱為函式。1 定義函式的格式 sql view plain co...

怎樣為std map的自定義鍵值

1 過載 運算子 也就是過載key類的小於運算子 include include using namespace std struct stsubkey 自定義key bool operator const stsubkey right const else int main 2 為map提供比較器...