以github備份模擬圖檔 Table of contents 背景 異地備援是很重要的一個課題。此處將模擬結果圖檔,以github為中介進行每日的異地備援。主要考量有幾:github有最高的安全規格,不論上載或下載均有良好管制。 github目前尚未被公司網管列入禁止傳輸檔案的對象,作為日常的傳輸並無阻攔,無須另外申請。 雖然github支援大檔的傳輸(見Git Large File Storage (LFS) 及筆記 ),但此處所要傳遞的是圖檔,經壓縮後一個檔案尚在100MB之內,也在github允許範圍。 github具有足夠之頻寬,適合公開發布。 需要解決的是如何在遠端創設(與刪除)github的repo 自動執行 因網管時間之設定,每天工作時間(8:00~17:30)才開放github。 而此時所有預報及後處理都已經結束,可以將圖檔上傳。 0 8 * * * /home/kuang/GitHubRepos/cp_timebar.cs > & ~/GitHubRepos/cp_timebar.out 2>&1
腳本內容分段說明 基本設定 由於crontab在執行的時候不會自行套用路徑環境,因此需用絕對路徑來執行 $GH_TOKEN
為gh
指令所需要之金鑰。GIT = /usr/bin/git
GH = /usr/bin/gh
gtd = ~/GitHubRepos
TOKEN = $( cat ~/bin/git.token)
export GH_TOKEN = $TOKEN
today = $( date +%Y%m%d)
rundate = $( date -d " $today +0day" +%Y%m%d)
BEGD = $( date -d " $today -1day" +%Y-%m-%d)
dates =() ; datep =()
for id in { 0..11} ; do
dates =( ${ dates [@] } $( date -d " $BEGD + ${ id } days" +%Y-%m-%d) )
datep =( ${ datep [@] } $( date -d " $BEGD + ${ id } days" +%Y%m%d) )
done
GRD =( 'grid45' 'grid09' 'grid03' )
複製檔案 將內部網路磁碟機的內容,複製一份到當天的repo之下,準備上傳。3個範圍10天的地面PM2.5模擬結果圖檔,經壓縮後共143MB 3個範圍10天的地面風場、HPBL檔案共428MB .git目錄也有約500MB。因無更新、變動的需求,這個目錄的內容可以刪除。 repo = cmaq_$rundate
mkdir -p ${ gtd } /${ repo }
cd ${ gtd } /${ repo }
cp /nas3/cmaqruns/2022fcst/grid45/cctm.fcst/daily/png1_${ BEGD } .tar.gz .
cp /nas2/cmaqruns/2022fcst/grid09/cctm.fcst/daily/png2_${ BEGD } .tar.gz .
cp /nas3/cmaqruns/2022fcst/grid03/cctm.fcst/daily/png3_${ BEGD } .tar.gz .
for id in { 0..11} ; do
cp /nas2/backup/data/NOAA/NCEP/GFS/YYYY/TWEPA_3k/U10V10_d03_${ dates [ $id ] } _00:00:00 .
cp /nas2/backup/data/NOAA/NCEP/GFS/YYYY/tw_CWBWRF_45k/U10V10_d0?_${ dates [ $id ] } _00:00:00 .
done
開創github上的新目錄 基本上github上的存放目錄是一份json檔案控制的內容,因此,開創一個新的目錄必須在https://api.github.com/user/repos
目錄下新增一個json檔案,並將檔案的所有權轉給本人。 指令使用詳見git and github筆記 說明 cmd = "/home/anaconda3/bin/curl -u sinotec2: $TOKEN https://api.github.com/user/repos -d '{ \" name \" : \" ${ repo } \" }'"
eval $cmd
curl -d
內容是個字串,如有環境變數會無法在命令列直接執行。需改以eval
方式執行。 檔案上傳 因檔案介於50~100MB,大檔傳輸git lfs
相關指令也可不執行。但如要執行,需先安裝lfs功能,見筆記 說明。 $GIT init
#large file storage
$GIT lfs install
$GIT lfs track "*.tar.gz"
$GIT add .
cmd = " $GIT commit -m 'create $repo '"
eval $cmd
$GIT push -f https://sinotec2:$TOKEN @github.com/sinotec2/${ repo } .git master
git commit其後的字串如有變數,會影響其顯示。改以eval
方式來執行。 刪除舊有目錄與內容 雖然github並沒有設定上傳總容量限制,但每天約1.1G的份量,久了也會塞爆github的硬碟。 此處設定保留4天的份額,每天將4天前的備份予以刪除。 刪除使用gh repo delete
指令,有關gh
的安裝、金鑰設定、指令使用等詳見git and github筆記 說明 last4d = $( date -d " $today -4day" +%Y%m%d)
repo = cmaq_$last4d
$GH repo delete https://github.com/sinotec2/${ repo } .git --yes
cd ..; rm -fr $repo
for id in { 0..8} ; do
rundate = $( date -d " $BEGD + ${ id } day" +%Y%m%d)
repo = cmaq_$rundate
$GH repo delete https://github.com/sinotec2/${ repo } .git --yes
echo $rundate ; done
檔案下載