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