linux自啓動腳本及解析

在/etc/profile.d/目錄下創建redis_start.sh文件:

#!/bin/sh
#chkconfig: 2345 80 90
#description:redis_start.sh
cd /usr/local/myredis_cluster
nohup sh ./redis_start.sh

#!/bin/sh
是指此腳本使用/bin/sh來解釋執行

#chkconfig: 2345 20 80
2345表示系統運行級別是2,3,4或者5時都啓動此服務,20,是啓動的優先級,80是關閉的優先級,如果啓動優先級配置的數太小時如0時,則有可能啓動不成功,因爲此時可能其依賴的網絡服務還沒有啓動,從而導致自啓動失敗。

#description:redis_start.sh
是描述信息

使用chmod設置可執行權限:

chmod +x rds_start.sh

然後將其拷貝到/etc/init.d/目錄下,否則添加服務不成功

cp rds_start.sh /etc/init.d/

設置開機啓動

chkconfig rds_start.sh on

reboot重啓。

說明:
/etc/init.d是/etc/rc/init.d軟鏈接文件
系統啓動之後,在進入init.d之前,我們先來看看系統都做了什麼工作。系統加電之後,首先進行的硬件自檢,然後是bootload對系統的初始化,加載內核。

內核被加載到內存之後,就開始執行了。一旦內核啓動運行,對硬件的檢測就會決定需要對哪些設備驅動進行初始化。

從這開始,內核就能夠掛裝根文件系統(這個過程類似於Windows識別並存取C盤的過程)。內核掛裝了根文件系統,並已初始化所有的設備驅動程序和數據結構等之後,就通過啓動一個叫init的用戶級程序,完成引導進程。

Init進程是系統啓動之後的第一個用戶進程,所以它的pid(進程編號)始終爲1。init進程上來首先做的事是去讀取/etc/目錄下inittab文件中initdefault id值,這個值稱爲運行級別(run-level)。它決定了系統啓動之後運行於什麼級別。運行級別決定了系統啓動的絕大部分行爲和目的。這個級別從0到6 ,具有不同的功能。不同的運行級定義如下:
  # 0 - 停機(千萬別把initdefault設置爲0,否則系統永遠無法啓動)
  # 1 - 單用戶模式
  # 2 - 多用戶,沒有 NFS
  # 3 - 完全多用戶模式(標準的運行級)
  # 4 – 系統保留的
  # 5 - X11 (x window)
  # 6 - 重新啓動 (千萬不要把initdefault 設置爲6,否則將一直在重啓 )

寫到這裏,應該差不多要進入init.d了,可是我覺得單寫/etc/rc.d/init.d的話不一定能說得清楚明白,就拿它跟/etc/rc.d這個它上一級的目錄一起來討論,可能比較合適一些,因爲他們之間有着千絲萬縷的關係。
在這裏先解釋一下init.d裏面放的都是什麼東西。這個目錄存放的是一些腳本,一般是linux以rpm包安裝時設定的一些服務的啓動腳本。系統在安裝時裝了好多rpm包,這裏面就有很多對應的腳本。執行這些腳本可以用來啓動,停止,重啓這些服務。
前面說到,/etc/rc.d/init.d這個目錄下的腳本就類似與windows中的註冊表,在系統啓動的時候執行。程序運行到這裏(init進程讀取了運行級別),相信從命名的角度大家也能猜到該運行/etc/rc.d/init.d裏面的腳本了,不然它爲什麼也叫init(.d)呢是吧。沒錯,是該運行init.d裏的腳本了,但是並不是直接運行,而是有選擇的因爲系統並不需要啓動所有的服務。
那麼,系統是如何選擇哪些需要啓動哪些不要呢?這時剛纔說的運行級別就起作用了。在決定了系統啓動的run level之後,/etc/rc.d/rc這個腳本先執行。在RH9和FC7的源碼中它都是一上來就check_runlevel()(雖然實現的代碼不一樣,也大同小異),知道了運行級別之後,對於每一個運行級別,在rc.d下都有一個子目錄分別是rc0.d,rc1.d …… rc6.d。每個目錄下都是到init.d目錄的一部分腳本一些鏈接。每個級別要執行哪些服務就在相對應的目錄下,比如級別5要啓動的服務就都放在rc5.d下,但是放在這個rc5.d下的都是一些鏈接文件,鏈接到init.d中相對應的文件,真正幹活到init.d裏的腳本。
到這裏,估計大家可能都比較清楚了,我開始也以爲是這樣的。可是後來我仔細看過和比較這些鏈接文件和init.d裏真正被執行的腳本的文件名之後,一直有幾個問題沒弄明白。藉着寫這個文章的機會,我做了一些功課,總算是大概解開了那些疑惑。
1、這些鏈接文件前面爲什麼會帶一個Kxx或者Sxx呢?
是這樣的,帶K的表示停止(Kill)一個服務,S表示開啓(Start)的意思
2、K和S後面帶的數字呢?幹什麼用的
這個我開始的時候還以爲是排列起來好看或者數數用呢。後來發現不是的。它的作用是用來排序,就是決定這些腳本執行的順序,數值小的先執行,數值大的後執行。很多時候這些執行順序是很重要的,比如要啓動Apache服務,就必須先配置網絡接口,不然一個沒有IP的機子來啓動http服務那豈不是很搞笑。。。
3、無意中我發現同一個服務帶S的和帶K的鏈接到init.d之後是同一個腳本。我就納悶了,爲什麼會是執行同一個腳本呢?
這個時候真是S和K的妙用了,原來S和K並不止是用來看起來分的清楚而已。S給和K還分別給init.d下面的腳本傳遞了start和stop的參數。哦,是這樣的(煥然大悟的樣子,呵呵)!這時我纔想起來原來曾經無數用過的/etc/rc.d/init.d/network restart命令。原來傳S時相當於執行了/etc/rc.d/init.d/xxx start這條命令,當然K就相當於/etc/rc.d/init.d/xxx stop了。
/etc/init.d 是 指向 /etc/rc.d/init.d 的軟鏈接。

發佈了88 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章