需求:
首先需要樹莓派自動掛載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