目前使用騰訊雲的對象存儲cos服務,將本地的文件同步到cos中,看了騰訊雲的用戶文檔,發現使用COS Migration 工具還是挺適合的。
原因
因為服務器已經安裝有java環境,而cos的幾個用戶工具中,用於自動同步的只看到這個工具,其他工具都需要額外的代碼去調用命令,
從開箱即用的角度看,還是這個工具好用的。
使用
配置下./conf/config.ini。指定好同步周期后,運行腳本
1 sh start_migrate.sh
因為是需要常駐運行,所以我這邊是后台運行的
nohup sh start_migrate.sh >/dev/null 2>&1 &
命令大體意思是
- nohup 表示后台運行
- sh start_migrate.sh 是具體的命令
- >/dev/null 2>&1 標准輸出到空,標准錯誤輸出重定向(等同於)標准輸出,即不保存腳本運行中產生的日志,也不保存錯誤信息(比如腳本不合法。。文件不存在)
- & 是與nohup一起的,表示不受終端關閉信號影響,保持后台運行。如果沒有&,在終端關閉時,當前終端執行的nohup進程也會被stop
日志
工具的日志默認是保存在./log下的,有info.log,warn.log,error.log 三個級別的日志。
1 migrateLocal over! op statistics: 2 op_status : ALL_OK 3 migrate_ok : 0 4 migrate_fail : 0 5 migrate_skip : 1094 6 migrate_condition_not_match : 0 7 start_time : 2018-07-14 11:05:57 8 end_time : 2018-07-14 11:05:59 9 used_time : 2 s
上面是腳本運行成功后的輸出,因為我之前已經同步過了,所以這里是顯示 migrate_skip 跳過的文件數。如果有新文件同步成功了,會在migrate_ok顯示成功文件數的。
同步結果中還有可以看到些文件是沒有同步成功的,具體的失敗原因從error.log中就會詳細說明。
utf-8
我這邊遇到的失敗原因全都是文件名亂碼,或者是說不是utf-8字符格式,導致工具找不到文件。日志中的信息基本是這個內容,就路徑不一樣
。。。 localpath /data/xxxxxx not exist! maybe the path contail illegal utf-8 letter ...
官方文檔已經明確指出
。
但我們的文件是從本地開發機中通過ftp上傳到服務器的。通過對比,那些亂碼文件都是含有中文的。
- 通過ftp到服務器后全部亂碼。
- 通過shell遠程touch中文名的文件,正常可同步。
搜索之后知道了ftp是需要設置語言環境的,即字符格式。正在使用的ftp是用默認語言環境,應該是跟系統一樣,windows是GBK。linux默認是utf-8
接下來就是刪除亂碼文件,修改ftp環境,重新同步文件了。
發現了亂碼文件后,想在終端中手動刪除文件,但無法選定。可以使用文件id進行指定。
ls -i ./ # 列出文件id及文件名 find ./ -inum xxxxx -print -exec rm {} \; # 獲取xxx文件id的文件名傳給附加命令 rm 刪除 如果是文件夾 -rf 需要加在{}后面
通知
有文件需要同步時,不想還要查看日志知道是否成功,打算通過webhook的方式自動通知同步結果。就像git有代碼提交后,有消息推送的webhook。目前是使用釘釘平台的自定義機器人
- 在群聊中添加自定義機器人,獲取webhook地址。
- 修改cos migration工具的源碼,在成功同步后添加通知任務,向webhook地址post數據
- 群聊中顯示同步結果,有成功的文件數,還有失敗的文件路徑及原因
具體代碼請查看我的另外一篇。
