理解Linux系統/etc/init.d目錄和/etc/rc.local指令碼

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   ar   strong   for   檔案   

本文英語版本來自:http://www.ghacks.net/2009/04/04/get-to-know-linux-the-etcinitd-directory/

     以下內容是作者自己的翻譯版本,如需轉載到CSDN外其他網站,請註明本文連結。

 一、關於/etc/init.d

     如果你使用過linux系統,那麼你一定聽說過init.d目錄。這個目錄到底是幹嘛的呢?它歸根結底只做了一件事情,但這件事情非同小可,是為整個系統做的,因此它非常重要。init.d目錄包含許多系統各種服務的啟動和停止指令碼。它控制著所有從acpid到x11-common的各種事務。當然,init.d遠遠沒有這麼簡單。(譯者註:acpid 是linux作業系統新型電源管理標準 ;X11也叫做X Window系統,X Window系統 (X11或X)是一種位元影像顯示的 視窗系統 。它是在 Unix 和 類Unix 作業系統 ,以及 OpenVMS 上建立圖形化使用者介面 的標準工具包和協議,並可用於幾乎已有的現代作業系統)。

    當你查看/etc目錄時,你會發現許多rc#.d 形式存在的目錄(這裡#代表一個指定的初始化層級,範圍是0~6)。在這些目錄之下,包含了許多對進程進行控制的指令碼。這些指令碼要麼以"K"開頭,要麼以"S"開頭。以K開頭的指令碼運行在以S開頭的指令碼之前。這些指令碼放置的地方,將決定這些指令碼什麼時候開始運行。在這些目錄之間,系統服務一起合作,就像健全狀態良好的機器一樣。然而,有時候你希望能在不使用kill 或killall 命令的情況下,能乾淨的啟動或殺死一個進程。這就是/etc/init.d能夠派上用場的地方了!

    如果你在使用Fedora系統,你可以找到這個目錄:/etc/rc.d/init.d。實際上無論init.d放在什麼地方,它都發揮著相同的作用。

     為了能夠使用init.d目錄下的指令碼,你需要有root許可權或sudo許可權。每個指令碼都將被作為一個命令運行,該命令的結構大致如下所示:

     /etc/init.d/command 選項

     comand是實際啟動並執行命令,選項可以有如下幾種:

  • start
  • stop
  • reload
  • restart
  • force-reload

       大多數的情況下,你會使用start,stop,restart選項。例如,如果你想關閉網路,你可以使用如下形式的命令:

     

         /etc/init.d/networking stop

        又比如,你改變了網路設定,並且需要重啟網路。你可以使用如下命令:

        /etc/init.d/networking restart

        init.d目錄下常用初始化指令碼有:

       

  • networking
  • samba
  • apache2
  • ftpd
  • sshd
  • dovecot
  • mysql

         當然,你可能有其他更多常用的指令碼,這個取決於你安裝了什麼linux作業系統。

 二、關於/etc/rc.local

      rc.local也是我經常使用的一個指令碼。該指令碼是在系統初始化層級指令碼運行之後再執行的,因此可以安全地在裡面添加你想在系統啟動之後執行的指令碼。常見的情況是你可以再裡面添加nfs掛載/mount指令碼。此外,你也可以在裡面添加一些調試用的指令碼命令。例如,我就碰到過這種情況:samba服務總是無法正常運行,而檢查發現,samba是在系統啟動過程中就該啟動執行的,也就是說,samba精靈配置保證了這種功能本應該正確執行。碰到這種類似情況,一般我也懶得花大量時間去查為什麼,我只需要簡單的在/etc/rc.local指令碼裡加上這麼一行:

          /etc/init.d/samba start

     這樣就成功的解決了samba服務異常的問題。

 

 三、總結

         Linux是靈活的。正因為它的靈活性,我們總是可以找到許多不同的辦法來解決同一個問題。啟動系統服務的例子就是一個很好的佐證。有了/etc/init.d目錄下的指令碼,再加上/etc/rc.local這個利器,你可以放心的確保你的服務可以完美的啟動和運行。

轉自:http://blog.csdn.net/acs713/article/details/7322082

另一篇:

本文包括3部分內容
  1、 Linux的引導過程
  2、 運行層級
  3、 /etc/rc.d/ 與/etc/rc.d/init.d的關係
  都僅限於自身的理解,如有差錯和不足的地方請指正和補充!一起學習,一起進步。

  “/etc/rc.d/init.d/目錄下的指令碼就類似與windows中的註冊表,在系統啟動的時候某些指定指令碼將被執行”。開始之前,先引用李善明經理昨天晚上總結時的一個理解,讓大家先對init.d目錄有個大概的印象。在進入init.d之前,我們一起來做兩個準備工作,linux的引導過程和運行層級的概念。

  一、 Linux的引導過程

  系統啟動之後,在進入init.d之前,我們先來看看系統都做了什麼工作,先看看一個圖(此圖來自網路,後期補上)
  從這個圖中,我們從比較高的角度去看開始引導的整個過程,比較清晰明了。系統加電之後,首先進行的硬體自檢,然後是bootloader對系統的初始化,載入核心。
  核心被載入到記憶體中之後,就開始執行了。一旦核心啟動運行,對硬體的檢測就會決定需要對哪些裝置驅動程式進行初始化。從這裡開始,核心就能夠掛裝根檔案系統(這個過程類似於Windows識別並存取C盤的過程)。核心掛裝了根檔案系統,並已初始化所有的裝置驅動程式和資料結構等之後,就通過啟動一個叫init的使用者級程式,完成引導進程。

  二、 運行層級(run level)

  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,否則將一直在重啟 )
  這是兩個表較常用運行層級(後期補上),左圖redhat9 層級3啟動的將是文本介面,右圖fc7層級5啟動的將是圖形介面。

  三、 /etc/rc.d/與/etc/rc.d/init.d的關係

  寫到這裡,應該差不多要進入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裡的指令碼。

  redhat9 ls
  fc7     ls -l
  這樣看的就很清楚了。
  到這裡,估計大家可能都比較清楚了,我開始也以為是這樣的。可是後來我仔細看過和比較這些連結檔案和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了

轉自:http://blog.csdn.net/r91987/article/details/7625411

理解Linux系統/etc/init.d目錄和/etc/rc.local指令碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.