Shell功能
脚本获取域名的IP地址
自动检测公网IP地址并更新到公云PubYun
获取公网IP地址的多种方式
深入理解 Bash 中的管道与子 Shell:防止常见陷阱
CentOS和Ubuntu的Shell兼容点
主机之间ping命令检测
脚本匹配ip地址正则表达式
CentOS 7.x系统三级等保规范脚本
Shell数值计算的几种方法
脚本单实例运行的进程锁
主机通过客户端实时上传本地文件到对象存储
执行命令前关闭history记录
Bash中的变量声明与处理
sed:使用正则匹配IP地址
sed: 匹配并在中间位置插入字符
Find排除多个目录并按多个后缀查找文件
Linux主机巡检脚本
增加CPU使用率到指定范围
本文档使用 MrDoc 发布
-
+
home page
主机通过客户端实时上传本地文件到对象存储
# 脚本逻辑 1. 定义了需要同步的源路径(src)、目标路径(des)和日志文件路径(logfile)。 1. 检查锁文件是否存在,如果锁文件存在且对应的进程仍在运行,则表示脚本已经在运行,输出日志信息并退出脚本。 1. 设置trap命令,确保在脚本接收到INT、TERM或EXIT信号时执行指定的命令。这里的命令是删除锁文件并退出脚本,以确保无论在什么情况下脚本都能正确地释放锁文件。 1. 将当前脚本的进程ID写入锁文件,用于表示当前实例正在运行。 1. 使用inotifywait命令监视源路径下的文件变化,并循环处理监控到的文件路径列表。 1. 从监控到的文件路径列表中提取出事件类型(INO_EVENT)和文件路径(INO_FILE)。 1. 判断事件类型是否为CLOSE_WRITEXCLOSE,如果是则表示文件已关闭写入。 1. 输出日志信息,表示添加了文件并开始同步。 1. 执行coscli命令进行文件同步,并将同步结果输出到日志文件。使用grep -v '100%'过滤掉同步进度为100%的日志信息。 1. 执行coscli命令计算目标路径下文件的CRC64校验值。 1. 如果CRC64校验值大于0,则表示文件已成功上传到COS,删除本地文件,并输出日志信息。 1. 在循环结束后,删除锁文件,释放锁资源。 总体来说,该脚本使用inotifywait命令监视源路径下的文件变化,并将发生变化的文件同步到COS。为了确保脚本的唯一性,使用了进程锁机制,避免多个实例同时运行。同时,通过日志记录了脚本的运行情况和同步结果。 # 脚本源码 >提示: 1、该脚本不包含对象存储客户端的相关配置,具体配置请参考各大云厂商官方文档 2、该脚本以腾讯COS为例,其他请自行替换使用 ```bash #!/bin/bash src='/data/docManual/mrdoc/media' # 需要同步的源路径 des='cos://yourcos-1356632769/media' logfile='/data/utils/synccos/info.log' # 定义锁文件路径 LOCKFILE="/var/lock/cosupload.lock" if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then echo "INFO[`date +%F\ %H:%M:%S`] Script already running... exit!" >> $logfile exit fi # 确保退出时,锁文件被删除 trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT #将当前程序进程id写入锁文件 echo $$ > ${LOCKFILE} # 将当前进程ID写入PID文件 echo "$$" > "$pid_file" echo "INFO[`date +%F\ %H:%M:%S`] Script starting..." >> $logfile /usr/bin/inotifywait -mrq --format '%Xe %w%f' -e modify,create,delete,attrib,close_write,move ${src}/ | while read file # 把监控到有发生更改的"文件路径列表"循环 do INO_EVENT=$(echo $file | awk '{print $1}') # 把inotify输出切割 把事件类型部分赋值给INO_EVENT INO_FILE=$(echo $file | awk '{print $2}') # 把inotify输出切割 把文件路径部分赋值给INO_FILE newFile=`echo $INO_FILE|sed "s#$src/##g"` #增加事件 if [[ $INO_EVENT =~ 'CLOSE_WRITEXCLOSE' ]];then # 判断事件类型 echo "---------------- $(date) ----------------" >> $logfile echo "INFO[`date +%F\ %H:%M:%S`] add file ${INO_FILE}" >> $logfile $(command -v coscli) sync $INO_FILE $des/$newFile|grep -v '100%' >> $logfile crc64=`$(command -v coscli) hash $des/$newFile|awk '{print $NF}'` if [[ $crc64 > 0 ]];then rm -f $INO_FILE echo "INFO[`date +%F\ %H:%M:%S`] file already upload to cos,local file deleted." >> $logfile fi fi done # 删除锁文件 rm -f ${LOCKFILE} ``` # 日志示例 脚本运行后的日志示例如下 ![](/media/202306/2023-06-08_134553_3218460.9969645510242282.png)
Nathan
June 8, 2023, 1:46 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password