嵌入式Linux开机启动SD卡下的程序脚本

2019-07-12 16:47发布

        今天板子上的空间不足了,就把程序移到了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 #include #include int main() { while(NULL==opendir("/media/LABEL2/tcp_Multi_process")) //检查SD卡是否已经挂载 { printf("file not exist! "); } if(system("/media/LABEL2/tcp_Multi_process/start.sh")<0) //执行SD卡程序 { printf("system error! "); } return 0; }编译为StartServer,在/etc/init.d/rc.local中启动这个小程序,至此成功实现SD卡程序的开机自启动。