1. 程式人生 > >嵌入式Linux開機啟動SD卡下的程式指令碼

嵌入式Linux開機啟動SD卡下的程式指令碼

        今天板子上的空間不足了,就把程式移到了SD卡上,發現root下也無法修改檔案的許可權,就直接在板子上用fdisk把SD卡給重新分割槽格式化了,可算能夠修改許可權了,又修改了/etc/rc.local檔案,添加了啟動指令碼的路徑,本以為萬事大吉,結果重啟板子

後,top檢視竟然沒有找到程式。以為是rc.local沒有執行許可權,檢視後發現一切正常,於是在rc.local里加了date "+%Y-%m-%d-%H:%M:%S">/StartTime.log來輸出時間,再次重啟後根目錄下根本沒有StartTime.log,手動執行rc.local發現沒問題,這就說明開機時根本沒有執行這個指令碼。趕緊上網搜,結果都說啟動的是rc.d目錄下的rc.local,但是我的板子上的Ubuntu,也就是linaro系統里根本沒有rc.d,於是在/etc下使用了ls -l rc*,結果發現,rc2.d、rc3.d、rc4.d、rc5.d下都有一個叫S99rc.local的軟連線,連線到了/etc/init.d/rc.local,於是輸入了runlevel,查看了當前的啟動級別,發現是二級,就進入了rc2.d裡修改S99rc.local(其實可以直接修改/etc/init.d/rc.local,但是當時太急就給忘了它們連線的都是一個檔案),美滋滋的重啟,果然發現根目錄下出現了StartTime.log,證明/etc/init.d/rc.local開機被運行了,開啟top,竟然還沒有要啟動的那個程式,真是一籌莫展啊,但是電腦虛擬機器裡的Ubuntu相同配置是可以自啟的,網上Google了半天也沒有什麼幫助,結果百度搜索立功了,

在百度裡一輸入關鍵詞,跳出來自動掛載,突然就想到,既然有的Linux不能自動掛載SD卡,那麼我的板子上的Linux核心在啟動時應該也沒有掛載SD卡,只是後來在某些腳本里掛載了,造成了自動掛載的現象,會不會在執行/etc/init.d/rc.local時,SD卡沒有掛載導致執行失敗了,就出現了時間能夠輸出,但我自己的程式沒有執行的結果;於是在輸出時間的後邊加了ls -l /media/LABEL2/*>/FILE.log。


重啟開機後,檢視根目錄下的FILE.log,發現為空,果然,rc.local執行的時候,SD卡根本就沒有掛載,所以無法啟動我的指令碼,但是這個程式執行需要連續存照片,空間需求很大,又不想更改程式碼,只能放在SD卡上。一番思考後,決定在板子的root目錄下寫一個小程式,開機直接啟動這個小程式,小程式一直檢測SD卡上的目錄是否可用,一旦可用,就執行啟動指令碼,這樣就可以用實現SD卡上的程式的自啟動了。判斷目錄是否可用的程式還是相當簡單的,如下,

#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
int main()
{
 while(NULL==opendir("/media/LABEL2/tcp_Multi_process"))		//檢查SD卡是否已經掛載
 {
	printf("file not exist!\n");
 }
 if(system("/media/LABEL2/tcp_Multi_process/start.sh")<0)		//執行SD卡程式
 {
	printf("system error!\n");
 }
 return 0;
}

編譯為StartServer,在/etc/init.d/rc.local中啟動這個小程式,至此成功實現SD卡程式的開機自啟動。