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系統主要通過以下步驟啟動
- 啟動Boot Manager
- 加載系統內核,啟動init進程, init進程是Linux的根進程,所有的系統進程都是它的子進程。
- init進程讀取“/etc/inittab”文件中的信進入inittab中預設的運行級別,按順序運行該運行級別對應文件夾(init*.d)下的腳本。腳本通常以“start”參數啟動,並指向一個系統中的程序。通常情況下,“/etc/rcS.d/”目錄下的啟動腳本首先被執行,然后是“/etc/rcN.d/”目錄。例如您設定的運行級別為3,那么它對應的啟動目錄為“/etc/rc3.d/”。
- 根據“/etc/rcS.d/”文件夾中對應的腳本啟動Xwindow服務“xorg” Xwindow為Linux下的圖形用戶界面系統。
- 啟動登錄管理器,等待用戶登錄
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加載后, 它將初始化硬件和設備驅動, 然后運行第一個進程init。init根據配置文件繼續引導過程,啟動其它進程。通常情況下,修改放置在
- /etc/rcN.d
- /etc/rcS.d
目錄下的腳本文件,可以使init自動啟動其它程序。例如:編輯/etc/rcS.d/rc.local(也就是/etc/rc.local,因為rcS.d鏈接目標為/etc) 文件(該文件通常是系統最后啟動的腳本),
在文件最末加上一行“xinit”或“startx”,可以在開機啟動后直接進入X-Window。
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>Ctr-D Job 1 at 2000-11-09 12:00
2000-11-09 12:00時候自動發一標題為“Have a lunch”,內容為plan.txt文件內容的郵件給Roger.
3.Ubuntu下添加開機啟動腳本
方式1:rc.local
Ubuntu開機之后會執行/etc/rc.local文件中的腳本,所以我們可以直接在/etc/rc.local中添加啟動腳本。
當然要添加到語句:exit 0 前面才行。
方式2:rcN.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為順序,5為rc5.d,符號.不要忘記
- 這樣會在會在/etc/rc5.d/下面創建1個符號鏈接,有必要在腳本的前段加一些provider/start-default等說明,否則報警,在Ubuntu上測試成功
- 在am4378上沒有測試成功 T_T.
另外一種是
- 將腳本設為可執行
- 在rcN.d下執行ln ../init.d/script-name S99script
- 在Ubuntu上沒有成功,不知為何
方式3:systemd