树莓派USB存储设备自动挂载并通过脚本实现自动拷贝,自动播放视频,脚本自动升级等功能

需求:
首先需要树莓派自动挂载USB设备,然后扫描USB指定目录下文件,将相关文件拷贝至树莓派指定目录,然后通过omxplayer循环播放新拷贝文件视频

1. 树莓派实现USB存储设备自动挂载

树莓派USB存储设备自动挂载
udev 实现 USB 设备自动挂载

需要注意的是:
必须使用pi用户登陆至图形界面(图形界面默认是开启移动设备自动挂载的),否则会挂载不成功,如果使用其他用户登录,系统界面会看到挂载失败的错误信息;通过上面的方法设置也不成功,最后都必须通过pi用户登录到图形界面。
上面的方法根本不可在命令行下实现USB设备的自动挂载。

2. 树莓派安装omxplayer

Raspberry pi音乐播放器omxplayer
轻松搞定omxplayer操作界面安装

3. Shell脚本实现文件自动拷贝并调用omxplayer循环播放拷贝的视频

  1 #! /bin/bash
  2 # -------------------------------------------------------------------
  3 # 该脚本结合树莓派pi用户自动挂载U盘功能,
  4 # 实现自动拷贝U盘指定目录下文件至树莓派指定目录下,进行文件解压缩等操作
  5 # 然后进行视频文件播放;
  6 # 增加脚本自动更新功能
  7 # 注:如果树莓派指定目录下存在待拷贝文件,则不进行cp操作
  8 # -------------------------------------------------------------------
  9 # mntpath为树莓派默认将U盘挂载路径
 10 mntpath="/media/udisk"
 11 # mnt为插入U盘存放待拷贝视频的默认文件夹名称,默认为U盘根目录
 12 mnt="/"
 13 # destination为将U盘中的视频文件需要拷贝到树莓派的哪个文件夹
 14 destination="/home/pi/media"
 15 # 文件拷贝过程中播放"视频拷贝中"视频的全路径名.
 16 audioAsync="${destination}/audiocopying.mp4"
 17 # 文件拷贝或者zip包解压缩异常,需要播放的错误提示信息视频
 18 errormedia="${destination}/error.mp4"
 19 # 线程休眠时间(秒)
 20 sleepsec=5
 21 # U盘待拷贝视频文件zip命名规则
 22 pattern=".*[lL]uck[tT]est_.*\.zip$"
 23 # 校验文件是否是mp4扩展名
 24 mp4pattern=".+\.mp4$"
 25 # 校验文件是否是shell脚本扩展名
 26 shpattern=".+\.sh$"
 27 # 待升级脚本所在目录
 28 scriptpath="/home/pi/"
 29 # 脚本名称
 30 scriptname="test_ad_autodisplay.sh"
 31 # 升级成功标识文件
 32 updatedfile="updated"
 33 # 默认播放得视频名称
 34 defaultDisplayAudioName="default.mp4"
 35 # zip包解压缩密码
 36 # zip -P test@123 *_lucktest_*.zip 1.mp4
 37 # sudo unzip -P "$password" -o -q "${destination}/${timedate}/${medianame}" -d "${destination}/${timedate}"
 38 password="test@123
 39 # -------------------------------------------------------------------
 40 # 入参 $1:需要播放文件的全路径名称
 41 # 传入待播放文件全路径名,检测并播放该文件
 42 # -------------------------------------------------------------------
 43 function checkAndDisplay(){
 44     echo "INFO:display file name is:$1"
 45     # 播放之前,先判断omxplayer是否安装
 46     if command -v omxplayer > /dev/null;then
 47         # omxplayer已安装,检测是否有omxplayer进程,如果有,需要kill该进程,播放新拷贝的文件
 48         echo "INFO:omxplayer command found.Begin to check if have omxplayer process."
 49         # 检测是否已启动omxplayer,如果已启动,需要kill掉omxplayer相关pid
 50         count=`ps -ef|grep omxplayer|grep -v "grep"|wc -l`;
 51         if [ 0 == $count ];then
 52             echo "INFO:omxplayer not started.Begin to display ${1} by omxplayer."
 53         else
 54             echo "INFO:omxplayer have stared.Begin to get its pid."
 55             # 获取omxplayer相关pids进行kill
 56             pids=`ps -ef|grep omxplayer|grep -v "grep"|awk '{print $2}'`
 57             echo "INFO:omxplayer pids are:$pids"
 58             if [ -n "$pids" ];then
 59                 pidarr=($pids)
 60                 for pid in ${pidarr[@]}
 61                 do        
 62                     echo "INFO:kill omxplayer process id:$pid!"
 63                     sudo kill -9 $pid
 64                 done        
 65             fi
 66         fi
 67     else
 68         echo "ERROR:omxplayer command has not found!Need to install omxplayer first!!!"
 69         return 1
 70     fi
 71     echo "INFO:excute cmd:sudo nohup sudo omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 &"
 72     # nohup运行omxplayer,--no-osd config do no display status info on the screen
 73     sudo nohup omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 &
 74     if [ $? -eq 0 ];then
 75         echo "INFO:excute cmd:sudo nohup sudo omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 & success!";
 76         return 0
 77     else
 78         echo "ERROR:excute cmd:sudo nohup sudo omxplayer --no-osd --loop -r -o hdmi "$1" >/dev/null 2>&1 & failure!";
 79         return 1
 80     fi
 81 }
 82 
 83 # -------------------------------------------------------------------
 84 # 入参 $1:需要删除哪个目录下的所有视频目录
 85 # 入参 $2:排除$1下的该目录,不删除
 86 # 删除指定目录下的所有目录,如果有$2,则排除该目录不删除
 87 # -------------------------------------------------------------------
 88 function deleteDir(){
 89     if [ -n $1 ];then
 90         echo "INFO:Need to delete the folders under the $1"
 91         echo "INFO:Need to exclusion folder name is : $2"
 92         if [ -d "${1}" ];then
 93             for delfile in ${1}/*
 94             do
 95                 echo "INFO:check file:${delfile} if need to delete!"
 96                 if [ -f "${delfile}" ];then
 97                     echo "INFO:${delfile} is a file, not delete!"
 98                 else
 99                     echo "INFO:${delfile} is a folder,begin to check it!"
100                     # 如果$2不为空,则进行排除删除,否则都删除
101                     if [ -n $2 ];then
102                         # 获取待校验文件名
103                         delfoldername=${delfile##*/}
104                         echo "INFO:current folder name is : ${delfoldername},exclusion folder name is : $2"
105                         if [ $delfoldername != $2 ];then
106                             sudo rm -fr "${delfile}"
107                             # 删除成功,打印成功信息
108                             if [ $? -eq 0 ];then
109                                 echo "INFO:delete folder:${delfile} success!"
110                             else
111                                 echo "ERROR:delete folder:${delfile} failure!"
112                             fi
113                         else
114                             echo "INFO:current folder name is equals to exclusion folder name,not delete"
115                         fi
116                     else
117                         echo "INFO:begin to delete folder:${delfile}"
118                         sudo rm -fr "${delfile}"
119                         # 删除成功,打印成功信息
120                         if [ $? -eq 0 ];then
121                             echo "INFO:delete folder:${delfile} success!"
122                         else
123                             echo "ERROR:delete folder:${delfile} failure!"
124                         fi
125                     fi
126                 fi
127             done
128         else
129             echo "ERROR:${1} is not a directory!"
130         fi
131     else
132         echo "ERROR:parameter 1($1) is null,do nothing!";
133     fi
134 }
135 
136 # -------------------------------------------------------------------
137 # 入参 $1:待播放视频根目录,该目录下存放的是yyyy-mm-dd的文件夹,文件夹内为播放的视频文件
138 # 自动播放视频功能,包括开机自动播放和拷贝异常恢复播放等,都由该方法实现
139 # 实现逻辑:对$destination目录进行ls -t排序,取最新时间文件夹里的mp4文件进行播放
140 # -------------------------------------------------------------------
141 function autoDisplaying(){
142     if [ -n $1 ];then
143         echo "INFO:auto displaying folder:$1"
144         if [ -d "${1}" ];then
145             # 如果当前目录为dirctory,则进行ll -t,获取最新时间戳folder,然后获取folder里面的视频进行播放
146             # 按时间排序list folder
147             # sudo ls -lt $1|grep -e '^d'|awk '{print $9}'
148             folders=`sudo ls -lt ${1}|grep -e '^d'|awk '{print $9}'`
149             echo "INFO:auto displaying folders are : $folders"
150             # 是否已播放成功
151             isdisplayed=
152             if [ -n "$folders" ];then
153                 foldersArray=($folders)
154                 for((i=0;i<${#foldersArray[@]};i++))
155                 do
156                     foldername=${foldersArray[i]}
157                     # 判断该foldername文件夹下是否有mp4文件,有则播放,break;否则继续循环
158                     for file4play in "${1}"/"${foldername}"/*
159                     do
160                         file4playname=${file4play##*/}
161                         # file4playname
162                         echo "$file4playname"|grep -E "$mp4pattern" > /dev/null
163                         # 如果符合mp4扩展名,说明是需要播放的视频,进行播放
164                         if [ $? -eq 0 ];then
165                             echo "INFO:autoDisplaying file:${file4playname}"
166                             checkAndDisplay "$file4play"
167                             if [ $? -eq 0 ];then
168                                 isdisplayed=0
169                                 # 跳出两层循环
170                                 break 2
171                             fi
172                         fi
173                     done
174                 done
175             else
176                 echo "ERROR:auto displaying folder:$1 has no child folder!"
177             fi
178             # 如果未播放成功,则需要播放默认视频
179             if [ ! -n "$isdisplayed" ];then
180                 echo "WARN:$1 have no audio to display,begin to display default audio!"
181                 # 如果待播放目录下没有视频目录,则判断该目录($1)下是否有默认播放视频($defaultDisplayAudioName),如果有则播放
182                 # 目前 $1 == $destination
183                 if [ -f "${1}/${defaultDisplayAudioName}" ];then
184                     checkAndDisplay "${1}/${defaultDisplayAudioName}"
185                 elif [ -f "${destination}/${defaultDisplayAudioName}" ];then
186                     # 如果$1目录下没有,则判断${destination}目录下是否有默认播放视频
187                     checkAndDisplay "${destination}/${defaultDisplayAudioName}"
188                 else
189                     echo "ERROR:default display file:${1}/${defaultDisplayAudioName} not exist,auto display do nothing!"
190                 fi
191             fi
192         else
193             echo "ERROR:auto displaying file path:${1} is not a directory!"
194         fi
195     else
196         echo "ERROR:parameter 1($1) is null,auto display do nothing!"
197     fi
198 }
199 
200 # -------------------------------------------------------------------
201 # 
202 # 入参 $1:升级的脚本文件全路径
203 # 入参 $2:$1脚本名称
204 #
205 # 处理逻辑如下:
206 # 重命名(加上当前时间戳)$scriptpath/$scriptname进行备份,
207 # 将$1脚本拷贝到$scriptpath目录下,
208 # 将$1文件重命名为$scriptname,reboot系统
209 #
210 # -------------------------------------------------------------------
211 function updateShellScript(){
212     # 如果脚本存在,则执行备份和拷贝操作
213     if [ -f "$scriptpath/$scriptname" ];then
214         timestp=`date "+%Y%m%d%H%M%S"`
215         # 备份当前被替换的脚本
216         sudo mv "${scriptpath}/${scriptname}" "${scriptpath}/${scriptname}.${timestp}"
217         if [ $? -eq 0 ];then
218             echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname} $scriptpath/${scriptname}.${timestp} success!"
219             # 拷贝$1至$scriptpath目录下
220             sudo cp -f "$1" "$scriptpath"
221             if [ $? -eq 0 ];then
222                 # 如果$2 == $scriptname,则不需要执行mv操作
223                 if [ "$2"!="$scriptname" ];then
224                     # 如果拷贝成功,则执行mv操作
225                     sudo mv "${scriptpath}/$2" "${scriptpath}/${scriptname}"
226                     # 如果mv操作成功,则执行reboot命令
227                     if [ $? -eq 0 ];then
228                         echo "INFO:excute cmd:sudo mv ${scriptpath}/$2 ${scriptpath}/${scriptname} success!"
229                         # 重命名成功,给该脚本添加执行权限
230                         sudo chmod +x "${scriptpath}/${scriptname}"
231                         # 启动之前创建升级成功标识文件,防止循环启动!
232                         if [ ! -f "${scriptpath}/${updatedfile}" ];then
233                             sudo touch "${scriptpath}/${updatedfile}"
234                         fi
235                         echo "INFO:shell script update finished.Reboot!!!"
236                         # 增加suid权限
237                         sudo chmod u+s /sbin/reboot
238                         reboot
239                     else
240                         echo "INFO:excute cmd:sudo mv ${scriptpath}/$2 ${scriptpath}/${scriptname} failure!Rollback!"
241                         echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname}!"
242                         #如果mv操作不成功,则执行回滚操作
243                         sudo mv "${scriptpath}/${scriptname}'.'${timestp}" "${scriptpath}/${scriptname}"
244                         if [ $? -eq 0 ];then
245                             echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} success!"
246                         else
247                             echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} failure!"
248                         fi
249                     fi
250                 else
251                     # 复制成功,给该脚本添加执行权限
252                     sudo chmod +x "${scriptpath}/${scriptname}"
253                     # 启动之前创建标识升级标识文件,防止循环启动!
254                     if [ ! -f "${scriptpath}/${updatedfile}" ];then
255                         sudo touch "${scriptpath}/${updatedfile}"
256                     fi
257                     echo "INFO:shell script update finished.Reboot!!!"
258                     # 增加suid权限
259                     sudo chmod u+s /sbin/reboot
260                     reboot
261                 fi
262             else
263                 # 如果拷贝不成功,则将原备份脚本进行回滚
264                 sudo mv "${scriptpath}/${scriptname}'.'${timestp}" "${scriptpath}/${scriptname}"
265                 if [ $? -eq 0 ];then
266                     echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} success!"
267                 else
268                     echo "INFO:excute cmd:sudo mv ${scriptpath}/${scriptname}.${timestp} ${scriptpath}/${scriptname} failure!"
269                 fi
270             fi
271         else
272             echo "ERROR:excute cmd:sudo mv $scriptpath/$scriptname $scriptpath/${scriptname}.${timestp} failure!Stop update shell script!!!"
273         fi
274     else
275         # 如果脚本不存在,则执行拷贝和重命名操作
276         echo "ERROR:shell script file:$scriptpath/$scriptname not exist.Copy $1 to path:$scriptpath"
277         sudo cp "$1" "$scriptpath"
278         if [ $? -eq 0 ];then
279             echo "INFO:Copy $1 to path:$scriptpath success!"
280             echo "INFO:rename file:$2 to $scriptname"
281             sudo mv "$scriptpath/$2" "$scriptpath/$scriptname"
282             if [ $? -eq 0 ];then
283                 echo "INFO:excute cmd:sudo mv $scriptpath/$2 $scriptpath/$scriptname success!"
284                 # 重命名成功,给该脚本添加执行权限
285                 sudo chmod +x "${scriptpath}/${scriptname}"
286                 # 启动之前创建标识升级标识文件,防止循环启动!
287                 if [ ! -f "${scriptpath}/${updatedfile}" ];then
288                     sudo touch "${scriptpath}/${updatedfile}"
289                 fi
290                 # 增加suid权限
291                 sudo chmod u+s /sbin/reboot
292                 reboot
293             else
294                 echo "ERROR:excute cmd:sudo mv $scriptpath/$2 $scriptpath/$scriptname failure!"
295             fi
296         else
297             echo "ERROR:Copy $1 to path:$scriptpath failure!"
298         fi
299     fi
300 }
301 
302 # -------------------------------------------------------------------
303 #
304 # 入参 $1:U盘挂载目录
305 #
306 # 检测待拷贝U盘指定目录下是否存在指定格式zip包,
307 # 如果存在,则拷贝至PI的指定目录下并解压,解压和拷贝过程中,播放"视频同步中"的视频
308 # 拷贝结束后,播放新拷贝的视频,删除早前的视频目录
309 #
310 # 1、检测到U盘插入信息,搜索“*测试_*.zip”文件,将该文件拷贝到树莓派文件系统并解压;停止原有视频播放,改为显示“视频同步中”图片;
311 # 2、计算每个mp4文件的Hash并和“目录名_hash”文件中的Hash值进行比较,全部相同则成功,有任一文件Hash值校验失败则显示失败;(TODO)
312 # 3、成功则将播放目录连接到当前copy进来的目录,并删除早期的视频目录,重新开始播放
313 # 4、失败则播放特定的图片(5s),提示错误,之后删除刚拷贝的文件和目录,重新播放之前的目录
314 # 5、树莓派记录视频更新日志,播放日志(具体格式待定,作为二期扩展功能)。(TODO)
315 #
316 # -------------------------------------------------------------------
317 function checkAndCopyZipFileToPi(){
318     if [ -d "${1}/${mnt}" ];then
319         echo "INFO:${1}/${mnt} is existed."
320         # 循环该目录文件,判断是否需要进行文件拷贝
321         for media in ${1}/$mnt/*
322         do
323             # 如果待拷贝文件为file,则判断文件名称是否符合zip命名规则,如果符合,则执行拷贝
324             if [ -f "$media" ];then
325                 echo "INFO:begin to check if file $media matchs to $pattern!"
326                 # 获取待校验文件名
327                 medianame=${media##*/}
328                 echo "INFO:file name is $medianame"
329                 # 校验medianame是否符合$pattern
330                 echo "$medianame"|grep -E "$pattern" > /dev/null
331                 if [ $? -eq 0 ];then
332                     timedate=`date "+%Y-%m-%d"`
333                     echo "INFO:$medianame matchs $pattern,copy it to ${destination}/${timedate}!"
334                     # 如果找到符合命名规范的文件,则播放“视频同步中”的视频
335                     checkAndDisplay "$audioAsync"
336                     if [ ! -d "${destination}/${timedate}" ];then
337                         sudo mkdir -p "${destination}/${timedate}"
338                         if [ $? -eq 0 ];then
339                             echo "INFO:excute cmd:mkdir -p ${destination}/${timedate} success!"
340                         else
341                             echo "INFO:excute cmd:mkdir -p ${destination}/${timedate} failure!"
342                             #如果目录创建失败,需要播放之前最新目录下的视频
343                             autoDisplaying "${destination}"
344                         fi
345                     fi
346                     # 安全起见,拷贝之前,再校验一遍目标目录是否存在
347                     if [ -d "${destination}/${timedate}" ];then
348                         # -f:if an existing destination file cannot be opened, remove it and try again
349                         sudo cp -f "$media" "${destination}/${timedate}"
350                         # 如果zip文件拷贝到PI指定目录成功,则执行解压缩和播放等逻辑
351                         # 3、成功则将播放目录连接到当前copy进来的目录,并删除早期的视频目录,重新开始播放
352                         if [ $? -eq 0 ];then
353                             echo "INFO:excute cmd:cp -n $media ${destination}/${timedate} success!"
354                             # unzip copy进来的zip包,-o:overwrite files WITHOUT prompting,-q:quiet mode
355                             sudo unzip -P "$password" -o -q "${destination}/${timedate}/${medianame}" -d "${destination}/${timedate}"
356                             # 如果unzip成功,则播放拷贝的文件,删除早前的视频目录
357                             if [ $? -eq 0 ];then
358                                 echo "INFO:excute cmd:sudo unzip -P $password -o -q ${destination}/${timedate}/${medianame} ${destination}/${timedate} success!"
359                                 ifhasmp4=
360                                 for unzipfile in "${destination}"/"${timedate}"/*
361                                 do
362                                     filename=${unzipfile##*/}
363                                     # 校验filename是否是shell脚本扩展名,如果是,则说明是需要升级的脚本
364                                     echo "$filename"|grep -E "$shpattern" > /dev/null
365                                     if [ $? -eq 0 ];then
366                                         # 如果脚本升级成功标识文件存在,则说明已升级成功,不再进行升级;将该标识文件进行删除,以便执行下次升级
367                                         if [ -f "${scriptpath}/${updatedfile}" ];then
368                                             echo "INFO:${scriptpath}/${updatedfile} file existed!Stop update!"
369                                             sudo rm -f "${scriptpath}/${updatedfile}"
370                                             if [ $? -eq 0 ];then
371                                                 echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} success!"
372                                             else
373                                                 echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} failure!"
374                                             fi
375                                         else
376                                             updateShellScript "$unzipfile" "$filename"
377                                         fi
378                                     fi
379                                     # 校验filename是否是mp4扩展名
380                                     echo "$filename"|grep -E "$mp4pattern" > /dev/null
381                                     # 如果符合mp4扩展名,说明是需要播放的视频,进行播放
382                                     if [ $? -eq 0 ];then
383                                         ifhasmp4=0
384                                         #线程休眠几秒,再执行播放
385                                         sleep $sleepsec
386                                         checkAndDisplay "$unzipfile"
387                                         # 如果checkAndDisplay播放成功,则删除早期的视频目录
388                                         if [ $? -eq 0 ];then
389                                             deleteDir "${destination}" "${timedate}"
390                                         else
391                                             # 先播放error视频提示播放失败信息
392                                             checkAndDisplay "${errormedia}"
393                                             sleep $sleepsec
394                                             # 如果checkAndDisplay播放不成功,则播放早期的视频
395                                             autoDisplaying "${destination}"
396                                         fi
397                                     fi
398                                 done
399                                 # 如果zip包解压后未发现mp4文件,则播放早期视频
400                                 if [  ! -n "$ifhasmp4" ];then
401                                     echo "ERROR:${destination}/${timedate}/${medianame} not have mp4 file,display before audio!"
402                                     autoDisplaying "${destination}"
403                                 fi
404                             else
405                                 echo "INFO:excute cmd:sudo unzip -P $password -o -q ${destination}/${timedate}/${medianame} ${destination}/${timedate} failure!"
406                                 # 先播放error视频提示播放失败信息
407                                 checkAndDisplay "${errormedia}"
408                                 sleep $sleepsec
409                                 # 解压缩失败,播放之前最新目录下的视频
410                                 autoDisplaying "${destination}"
411                             fi
412                         else
413                             # 4、拷贝失败则播放特定的图片(5s),提示错误,之后删除刚拷贝的文件和目录,重新播放之前的目录
414                             # (不能删除刚拷贝的文件和目录)否则存在以下问题:
415                             # 存在第一次拷贝成功,然后删除了早期的视频目录,第二次进行覆盖拷贝时异常,如果删除刚拷贝的文件和目录,则会导致无视频播放的问题
416                             echo "ERROR:excute cmd:cp -n $media ${destination}/${timedate} failure!"
417                             # 播放拷贝失败视频
418                             checkAndDisplay "${errormedia}"
419                             sleep $sleepsec
420                             # 播放之前最新目录下的视频
421                             autoDisplaying "${destination}"
422                         fi
423                     else
424                         echo "INFO:${destination}/${timedate} file path is not exist!"
425                         #如果目录不存在,需要播放之前最新目录下的视频
426                         autoDisplaying "${destination}"
427                     fi
428                 else
429                     echo "WARN:$medianame not matchs $pattern,not copy it!"
430                 fi
431             fi
432         done
433     fi
434 }
435 
436 # -------------------------------------------------------------------
437 # 循环检测是否有USB设备插入树莓派,手动挂载该USB设备至/media/udisk/${i}目录下
438 # 手动挂载USB设备时,需要判断该设备是否已挂载,如果已挂载,则不再进行挂载
439 # 当检测到无USB设备插入时,需要将挂载的信息手动umount,删除挂载的目录等
440 # -------------------------------------------------------------------
441 function autoScanUsbDeviceAndMount(){
442     while true
443     do
444         timeb=`date "+%Y-%m-%d %H:%M:%S"`
445         echo "${timeb}:=======================Scan USB devices start=============================="
446         if [ ! -d $mntpath ];then
447             echo "WARN:$mntpath file path not exist,excute mkdir cmd create it!"
448             sudo mkdir -p $mntpath
449         fi
450         #获取挂载的usb devices,挂载之前需要判断该USB设备是否已挂载,如果已挂载,则不再执行挂载操作
451         fdisks=`sudo fdisk -l|grep -E "^/dev/sd[a-z]1"|grep -v "Disk"|awk '{print $1}'`
452         echo "INFO:usb devices are : $fdisks"
453         if [ -n "$fdisks" ];then
454             fdiskArray=($fdisks)
455             for((i=0;i<${#fdiskArray[@]};i++))
456             do
457                 filesystem=${fdiskArray[i]}
458                 #检测该USB设备是否已挂载
459                 count=`df -h|grep -E "^${filesystem}"|grep -v "Filesystem"|wc -l`;
460                 echo "INFO:excute cmd:df -h|grep -E '^${filesystem}'|grep -v 'Filesystem'|wc -l,count:${count}"
461                 if [ $count -gt 0 ];then
462                     echo "WARN:${filesystem} have already mounted!"
463                 else
464                     if [ ! -d "${mntpath}/${i}" ];then
465                         echo "WARN:${mntpath}/${i} file path not exist,excute mkdir cmd create it!"
466                         sudo mkdir -p "${mntpath}/${i}"
467                     fi
468                     echo "INFO:excute mount cmd to mount ${filesystem} on ${mntpath}/${i}"
469                     sudo mount -o uid=${USER},gid=${USER} ${filesystem} ${mntpath}/${i}
470                     # 挂载成功,判断路径是否存在,存在则执行拷贝
471                     if [ $? -eq 0 ];then
472                         echo "INFO:excute cmd:sudo mount -o uid=${USER},gid=${USER} ${filesystem} ${mntpath}/${i} success!"
473                         checkAndCopyZipFileToPi "${mntpath}/${i}"
474                     else
475                         echo "ERROR:excute cmd:sudo mount -o uid=${USER},gid=${USER} ${filesystem} ${mntpath}/${i} failure!"
476                     fi
477                 fi    
478             done
479         else
480             # 没有USB设备,如果脚本升级成功标识文件存在,将其删除,
481             # 以便USB设备插入后,如果升级包中包含脚本升级文件做升级处理
482             if [ -f "${scriptpath}/${updatedfile}" ];then
483                 echo "INFO:${scriptpath}/${updatedfile} file existed!Remove it!"
484                 sudo rm -f "${scriptpath}/${updatedfile}"
485                 if [ $? -eq 0 ];then
486                     echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} success!"
487                 else
488                     echo "INFO:excute cmd:sudo rm -f ${scriptpath}/${updatedfile} failure!"
489                 fi
490             fi
491             # 如果没有USB设备,则需要将mount的设备进行umount,删除该USB设备mount目录下对应的文件夹
492             usbmounts=`df -h |grep -E "^/dev/sd[a-z]1"|grep -v "Filesystem"|awk '{print $1" "$6}'`
493             if [ -n "$usbmounts" ];then
494                 usbmountArray=($usbmounts)
495                 for((j=0;j<${#usbmountArray[@]};j=j+2))
496                 do
497                     umdevice=${usbmountArray[j]}
498                     umountpath=${usbmountArray[j+1]}
499                     echo "INFO:prepare to umount device:${umdevice} from file path:${umountpath}"
500                     sudo umount "${umountpath}"
501                     echo "INFO:${umdevice} umount from ${umountpath} success!"
502                     echo "INFO:prepare to remove path:${umountpath}"
503                     # 判断挂载的目录是否存在,存在则删除
504                     if [ -d "${umountpath}" ];then
505                         sudo rm -fr "${umountpath}"
506                         echo "INFO:rm -fr ${umountpath} success!"
507                     else
508                         echo "INFO:path ${umountpath} not exist!"
509                     fi
510                 done
511             fi
512         fi
513         timee=`date "+%Y-%m-%d %H:%M:%S"`
514         echo "${timee}:=======================Scan USB devices end================================"
515         echo "INFO:Thread sleep ${sleepsec}s!"
516         sleep $sleepsec
517         echo "INFO:Thread wakeup!"
518     done
519 }
520 
521 # -------------------------------------------------------------------
522 # @Deprecated
523 # INFO:该函数暂时废弃
524 # 循环检查是否有U盘挂载至树莓派
525 # -------------------------------------------------------------------
526 function autoScanUsbDeviceMounted(){
527     while true
528     do
529         timeb=`date "+%Y-%m-%d %H:%M:%S"`
530         echo "${timeb}:=======================Scan start=============================="
531         if [ ! -d $mntpath ];then
532             echo "WARN:$mntpath file path not exist,excute mkdir cmd create it!"
533             sudo mkdir -p $mntpath
534         else
535             echo "INFO:$mntpath file path is existed."
536         # 循环U盘挂载目录,判断是否有U盘挂载至当前树莓派
537             for file in $mntpath/*
538             do
539             # 如果当前file为文件目录
540                 if [ -d $file ];then
541                 echo "INFO:$file is directory"
542             # 如果当前目录下存在$mnt文件夹,说明是U盘挂载待拷贝文件目录
543                 if [ -d "$file/$mnt" ];then
544                     echo "INFO:$file/$mnt is existed."
545                 # 循环该目录文件,判断是否需要进行文件拷贝
546                 for media in $file/$mnt/*
547                     do
548                 # 如果待拷贝文件为file,则判断目的文件目录是否存在同名文件,存在同名文件不进行拷贝
549                     if [ -f "$media" ];then
550                         echo "INFO:begin to copy $media to $destination"
551                     # 获取待拷贝文件名
552                     medianame=${media##*/}
553                     echo "INFO:media name is $medianame"
554                     # 如果目的文件夹下不存在同名文件,则执行拷贝
555                     if [ ! -f "$destination/$medianame" ];then
556                             cp -n "$media" $destination
557                         echo "INFO:copy file:$medianame to $destination success!Begin to display by omxplayer!"
558                     # omxplayer需要循环播放的文件
559                     displayfilename="$destination/$medianame"
560                     # 播放之前,先判断omxplayer是否安装
561                     if command -v omxplayer > /dev/null;then
562                         # omxplayer已安装,检测是否有omxplayer进程,如果有,需要kill该进程,播放新拷贝的文件
563                         echo "INFO:omxplayer command found.Begin to check if have omxplayer process."
564                         checkAndDisplay "$displayfilename" 
565                     else
566                         echo "ERROR:omxplayer command has not found!!!"
567                     fi
568                     else
569                         echo "WARN:$destination existed media file:$medianame,not excute copy cmd!"
570                     fi
571                     fi
572                 done
573                 fi
574             else
575                 echo "WARN:$file is file"
576             fi
577            done
578         fi
579         timee=`date "+%Y-%m-%d %H:%M:%S"`
580         echo "${timee}:=======================Scan end================================"
581         echo "INFO:Thread sleep ${sleepsec}s!"
582         sleep $sleepsec
583         echo "INFO:Thread wakeup!"
584     done
585 }
586 
587 # -------------------------------------------------------------------
588 # 树莓派启动后,执行该方法初始化开机自动播放视频\扫描USB是否插入然后自动挂载复制相关视频文件等操作
589 # -------------------------------------------------------------------
590 function bootStrapInit(){
591     # 初始化默认播放最新目录下文件夹中的最新视频
592     echo "INFO:bootstrap init excute method:autoDisplaying(${destination})!"
593     autoDisplaying "${destination}"
594     echo "INFO: bootstrap init excute method:autoScanUsbDeviceAndMount()"
595     autoScanUsbDeviceAndMount
596     
597 }
598 
599 bootStrapInit
View Code

4.后台启动脚本

 nohup ./test_ad_autodisplay.sh >>scan.log 2>&1 & 

5.开机自动启动脚本

linux添加开机自启动脚本示例详解

/etc/rc.local添加如下脚本:

sudo /home/pi/test_ad_autodisplay.sh >> /home/pi/`date "+%Y-%m-%d"`.log 

猜你喜欢

转载自www.cnblogs.com/Java-Script/p/11095686.html