需求:
首先需要树莓派自动挂载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

转载于:https://www.cnblogs.com/Java-Script/p/11095686.html

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

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

    树莓派USB存储设备自动挂载 简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用m ...

  2. 树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载

    此方法对树莓派Jessie系统不适用 简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常 ...

  3. 树莓派2(Raspberry pi)取消 usb 存储设备的自动挂载

    自从入手树莓派后,一直都在被树莓派的USB设备自动挂载问题所困扰,这个自动挂载的起因是GNOME图形化界面组件里自带了这个功能.那么我们如何在树莓派中取消这项功能呢?国内关于自动挂载问题,无外乎就是去 ...

  4. 树莓派linux系统识别u盘启动,树莓派Raspberry Pi实战之命令行下实现USB存储设备自动挂载...

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

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

    简单介绍实现命令行下USB存储设备自动挂载的方法, linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备 但是在命令行下 通常需要用mount命令手动挂载USB存 ...

  6. linux 自动挂载usb设备,Raspberry Pi 自动挂载USB存储设备

    简单介绍实现命令行下USB存储设备自动挂载的方法,Linux gnome/kde窗口环境下有移动存储的管理程序,可以实现自动挂载移动存储设备,但是在命令行下 通常需要用mount命令手动挂载USB存储 ...

  7. 掀开USB存储设备自动运行的面纱(精简版)

    前前言2:为什么有精简版? 考虑原文(http://blog.sina.com.cn/u/56b798f8010007ht)太长而且比较罗嗦,部分新手会失去耐心看完,因此特地修改原文推出精简版.精简版 ...

  8. 用 C# 编写 USB 存储设备使用痕迹检测和删除工具

    编写 USB 存储设备使用痕迹检测和删除工具 (C# Windows Form 编程练习) [版权所有 邱秋 2014 metaphysis@yeah.net, 转载请注明出处] 第一节 准备知识 之 ...

  9. USB存储设备的5种打开方式以及其关系

    1. USB存储设备的标识 USB存储设备插入电脑之后,系统会给设备分配物理驱动器号.设备路径.卷路径. 1.1. 物理驱动器号 String Meaning \\.\PhysicalDrive0 O ...

最新文章

  1. 基于ANN的6种调制信号自动调制识别(2ASK、4ASK、2FSK、4FSK、2PSK、4PSK)
  2. bootstrap checkbox选中事件
  3. python --条件判断和语句控制
  4. 【Java基础篇】集合排序
  5. dell加装固态硬盘_技术丨如何进行笔记本硬盘拆装?
  6. 【Python学习笔记】列表生成式和生成器
  7. 如何用 Nginx 禁止国外 IP 访问网站?
  8. 【ProCAST】铸件定向凝固仿真流程学习总结
  9. 搜狗输入法linux设置快捷键设置,搜狗输入法怎么创建桌面快捷键方式?
  10. Arch Linux 天坑
  11. vue配置文件不打包
  12. Pom.xml文件教程详解
  13. 网络代理神器-非常代理
  14. Access根据出生日期计算年龄_WPS表格技巧—如何根据出生年月日求虚岁年龄
  15. java中abstract怎么使用
  16. Eclipse安装使用
  17. “全球发布——主流声音 · 最强路径”在深落幕 引领主流生态融合新模式
  18. 动态规划-最长公共子序列-最长递增子序列-最大递增子序列和-miking time
  19. 【OpenGL】实现三维空间漫游和立方体、球体贴图
  20. 币圈指数哪家强?且看分析OK VS 火币

热门文章

  1. 微信小程按钮篇--用图片作为按钮
  2. Boston Dog
  3. 链游财经发布新鲜有趣的链游资讯
  4. vsftpd 配置文件详解
  5. VHDL电话计费系统设计
  6. sql server 统计表信息
  7. android vulkan 游戏,王者荣耀Vulkan
  8. 攀登者张梁将出席深圳户外展宣传登山文化,讲述18年登山探险史
  9. Frequency Estimation Heavy Hitter under Local Differential Privacy的一些重要组件
  10. 【答学员问】- 该如何根据岗位学习相关技能