樹莓派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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM