1. 程式人生 > >Linux啟動和關閉時自動執行的所有指令碼檔案

Linux啟動和關閉時自動執行的所有指令碼檔案

原文地址:http://www.cnblogs.com/armlinux/archive/2010/08/11/2390949.html

     Linux使用的是基於執行級(run-levels)概念的稱為SysVinit的專用啟動工具。SysVinit(從現在開始我們稱之為"init")以執行級的模式來工作,一般有7(從06)個執行級(實際上可以有更多的執行級,但都是用於特殊情況而且一般使用不到。參見init(8)以獲得更多資訊),每個執行級對應於一套設定好的任務,當啟動一個執行級的時候, 計算機就需要執行相應的任務。預設的執行級是 3,下面是對不同執行級的描述:

0: 關閉計算機
1: 
單使用者模式
2: 
無網路多使用者模式


3: 
有網路多使用者模式
4: 
保留作自定義,否則同執行級
5: 
同執行級4,一般用於圖形介面(GUI)登入(如 X的 xdm 或 KDE的 kdm) 
6: 
重啟動計算機

       用來改變執行級別的命令是init <runlevel>,在這裡 <runlevel>是目標執行級別。

   在 /etc/rc.d 目錄下有很多類似 rc?.d (這裡? 是執行級別的數值)和 rcsysinit.d 的目錄,裡面都包含許多符號連結,其中一些以 K 字母開頭,另外一些以 S 字母開頭,這些連結名在首字母后面都跟著兩個數字。 這個 K的含義是停止 (kill)一個服務, S的含義是啟動一個服務。而數字則確定這些指令碼的啟動順序,從00 到 99(數字越小執行的越早)。當 init 轉換到其它執行級時,一些相應的服務會停止, 而另一些服務則會啟動。

     真正的指令碼在 /etc/rc.d/init.d 目錄下,它們完成實際工作, 符號連結都是指向它們的。停止指令碼的連結和啟動指令碼的連結都指向 /etc/rc.d/init.d 目錄下的同一個指令碼。這是因為呼叫這些指令碼時可以使用不同的引數,例如 start, stop, restart, reload,和 status。當呼叫 K連結時,相應的指令碼用 stop引數執行;當呼叫S 連結時,相應的指令碼用start 引數執行。

     上面的說明有一個例外,在 rc0.d 和 rc6.d 目錄下以 S 開頭的連結不會啟動任何東西,而是用stop引數呼叫,來停止某些服務。 這背後的邏輯是, 當用戶要重啟或關閉系統的時候,不會要啟動什麼服務, 只會要系統停止。

以下是指令碼引數的描述:

start
啟動服務。
stop  
          停止服務。
restart
關閉服務,然後再啟動。
reload
該服務的配置已更新。如果修改了某個服務的配置檔案,又不必重啟這個服務的時候,可以使用這個引數
status
顯示服務的狀態,如果服務正在執行,會顯示該服務程序的PID

     您可以自由修改啟動程序工作的方式。我們這裡給出的檔案只是它們怎樣工作的一個示例而已。

Linux的開機的整個過程如下:

  1. 開電腦電源,BIOS並進行主的自我測試

  2. 透過 BIOS取得第一個可開機裝置,讀取主要開機區(MBR)取得開機管理程式;

  3. 透過開機管理程式的設定,取得kernel並載入記憶體且偵測系統硬體;

  4. 核心主動呼叫 init程式;

  5. init程式開始執行系統初始化(/etc/rc.d/rc.sysinit)

    執行/etc/init.d/functions,設定環境變數等。

  6. 依據 init的設定進行daemonstart (/etc/rc.d/rc[0-6].d/*)

    依次執行指令碼,啟動服務。關機時依次關閉服務。

  7. 載入本機設定 (/etc/rc.d/rc.local)

     /etc/profile檔案。這個檔案是系統啟動時,任何使用者登入時執行的檔案。任何使用者登入前,root使用者也會執行一遍。

     ~/.bash_profile檔案。這個檔案每個使用者都有。它在使用者登入時自動執行,擁有使用者的許可權。它export的環境變數對該使用者隨後啟動的程序都有效。

     因此:

     如果使用者需要開機自動以root許可權執行一些指令碼,那麼最好的方法是編輯/etc/rc.d/rc.local檔案。

     如果每一個使用者登入時都應該執行的指令碼,如設定一些環境變數,那麼應該修改/etc/profile檔案。或者將指令碼放置在/etc/profile.d/目錄下,/etc/profile檔案會去呼叫這些指令碼。

     如果某一個特定使用者登入時應該執行特定的指令碼,如設定該使用者特定的環境變數,應該修改~/.bash_profile檔案。

關於如何編寫/etc/init.d下的指令碼參考:http://blog.chinaunix.net/uid-26000296-id-3986914.html