[啟動]Linux啟動流程rcN.d rcS.d rc.local

Linux嵌入式相關項目走到最後很難避開要開機自啟一些應用程式或者腳本等,最近也在幫助同事做這個事情,以前自己玩板子的時候都是較為隨便的在/etc/rc.local中添加就可以了,但是專案的話還是走標準一些,不僅為了自己以後的維護,也為了以後同事的維護。所以分享下面的文章

推薦:

啟動腳本和service、chkconfig:http://blog.csdn.net/taiyang1987912/article/details/41698817

轉自http://blog.csdn.net/listener_ri/article/details/45128569

當前系統環境為:Linux mint mate 17.1(基於ubuntu14.04的衍生版)

首先

/etc/rc*.d資料夾中的指令檔的連結目標為:/etc/init.d資料夾下的腳本(*為系統運行級別數位和字母:S,系統優先運行rcS.d目錄下的腳本,然後運行rcN.d下的腳本)

/etc/inittab: inittab為系統的PID=1的進程,決定這系統啟動調用哪些啟動指令檔

1.Linux系統主要通過以下步驟啟動

  1. 啟動Boot Manager
  2. 載入系統內核,啟動init進程, init進程是Linux的根進程,所有的系統進程都是它的子進程。
  3. init進程讀取“/etc/inittab”檔中的信進入inittab中預設的運行級別,按順序運行該運行級別對應資料夾(init*.d)下的腳本。腳本通常“start”參數啟動,並指向一個系統中的程式。通常情況下,“/etc/rcS.d/”目錄下的啟動腳本首先被執行,然後是“/etc/rcN.d/”目錄。例如您設定的運行級別為3,那麼它對應的啟動目錄為“/etc/rc3.d/”
  4. 根據“/etc/rcS.d/”資料夾中對應的腳本啟動Xwindow服務“xorg”      XwindowLinux下的圖形化使用者介面系統。
  5. 啟動登錄管理器,等待用戶登錄

1.1.系統服務

在運行級別對應的資料夾中,您可以看到許多檔案名以“S##”和“K##”起始的啟動腳本連結

init 進程將以“start”為參數,按檔案名循序執行所有以“S##”起始的腳本。腳本名稱中的數字越小,它將被越早執行。

例如在 “/etc/rc2.d/”資料夾中,“S13gdm”檔案名中的數字小於“S23xinetd”,“S13gdm”將比“S23xinetd”先執行。

如果一個腳本連結,以“K##”起始,表示它將以“stop”參數被執行。如果相應服務沒有啟動,則不執行該腳本。

1.2.手動控制服務

你可以手動運行帶有以下參數的啟動腳本,來控制系統服務。
start 啟動
stop 停止
restart 重啟

例如:
/etc/rc2.d/K20powernowd start
有 時您並不清楚當前運行級別,該運行級別下未必有相應腳本;而且此類腳本的前三位元字元並不固定,不便於記憶。

這時,您可以直接使用 “/etc/init.d/”資料夾中的啟動腳本(因為“/etc/rcX.d/”中的啟動腳本都是連結到“/etc/init.d/”資料夾下相應腳本)

具體都有那些系統服務腳本,可以看另一篇文章:《ubuntu中init.d資料夾中常用系統服務腳本》

2.Ubuntu系統架構關於啟動項大致分為四類,每一類都分為系統級和使用者級

  • 第一類upstart,或者叫job,由init管理,設定檔目錄/etc/init~/.init
  • 第二類叫service,由rc.d管理,設定檔目錄/etc/init.d,以及/etc/rc.local文件
  • 第三類叫cron,由contab管理,使用crontab進行配置
  • 第四類叫startup,由xdg管理,設定檔目錄/etc/xdg/autostart,以及~/.config/autostart

upstart任務適用於runlevel<5的腳本和程式,service任務適用於runlevel<=5的任務,cron任務則不一定,而startup一般工作在runlevel=5,也就是桌面級。

對於普通用戶而言,你的桌面級應用應該使用startup,服務級應用(比如某些功能性的軟體腳本)應該使用service,常規性配置可以使用cron,而與啟動順序有關的最好使用upstart

2.1. 開機啟動時自動運行程式

Linux載入後, 它將初始化硬體和設備驅動, 然後運行第一個進程initinit根據設定檔繼續引導過程,啟動其它進程。通常情況下,修改放置在

  • /etc/rcN.d
  • /etc/rcS.d

目錄下的指令檔,可以使init自動啟動其它程式。例如:編輯/etc/rcS.d/rc.local(也就是/etc/rc.local,因為rcS.d連結目標為/etc) (該檔通常是系統最後啟動的腳本)

在檔最末加上一行“xinit”或“startx”,可以在開機啟動後直接進入XWindow

2.2. 登錄時自動運行程式

使用者登錄時,bash先自動執行系統管理員建立的全域登錄script 

/ect/profile(大多在此檔中設置環境變數,它是整個桌面環境使用的一個shell進程,也就是登錄shell

>>>linux中的shell可以分為:登錄shell,非登錄互動式shell,非登錄非互動式shell(執行shell腳本)

>>>具體可以查看另一篇文章:《 linux中各個shell設定檔的作用域和啟動時間 》

然後bash在使用者起始目錄下按順序查找三個特殊檔中的一個:

  • /.bash_profile
  • /.bash_login
  • /.profile

但只執行最先找到的一個。因此,只需根據實際需要在上述檔中加入命令就可以實現用戶登錄時自動運行某些程式(類似於DOS下的Autoexec.bat)。

2.3. 退出登錄時自動運行程式

退出登錄時,bash自動執行個人的退出登入指令檔

  • /.bash_logout

例如,在/.bash_logout中加入命令“tar cvzf c.source.tgz .c”,則在每次退出登錄時自動執行 “tar” 命令備份 *.c 文件。

2.4. 定期自動運行程式

Linux有一個稱為crond的守護程式,主要功能是週期性地檢查 /var/spool/cron目錄下的一組命令檔的內容,並在設定的時間執行這些檔中的命令。用戶可以通過crontab 命令來建立、修改、刪除這些命令檔。

例如,建立檔crondFile,內容為“00 9 23 Jan HappyBirthday”,運行“crontabcronFile”命令後,每當元月23日上午9:00系統自動執行“HappyBirthday”的程式(表示不管當天是星期幾)。

2.5. 定時自動運行程式一次

定時執行命令at 與crond 類似(但它只執行一次):命令在給定的時間執行,但不自動重複。at命令的一般格式為:at [ f file ] time ,在指定的時間執行file檔中所給出的所有命令。也可直接從鍵盤輸入命令:

 at 12:00
at>mailto Roger -s Have a lunch < plan.txt
at>CtrD
Job 1 at 20001109 12:00

 

20001109 12:00時候自動發一標題為“Have a lunch”,內容為plan.txt檔內容的郵件給Roger.

3.Ubuntu下添加開機啟動腳本

方式1rc.local

Ubuntu開機之後會執行/etc/rc.local檔中的腳本,所以我們可以直接在/etc/rc.local中添加啟動腳本。

當然要添加到語句:exit 0 前面才行。

方式2rcN.d

如果要添加為開機啟動執行的指令檔,可先將腳本複製或者軟連接到/etc/init.d/目錄下,然後用:update-rc.d xxx defaults NN命令(NN為啟動順序),將腳本添加到初始化執行的佇列中去。

注意如果腳本需要用到網路,則NN需設置一個比較大的數字,如98

  • 將腳本設為可執行許可權,並拷貝至/etc/init.d
  • /etc/init.d路徑下執行update-rc.d script-name start 98 5 . 注:98為順序,5rc5.d,符號.不要忘記
  • 這樣會在會在/etc/rc5.d/下面創建1個符號連結,有必要在腳本的前段加一些provider/start-default等說明,否則報警,在Ubuntu上測試成功
  • am4378上沒有測試成功 T_T.

另外一種是

  • 將腳本設為可執行
  • rcN.d下執行ln ../init.d/script-name S99script
  • Ubuntu上沒有成功,不知為何

方式3systemd

arrow
arrow
    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()