Linux环境下如何判断外部系统上传的文件已完成复制?
判断Linux下文件复制完成的几种方法
在Linux环境中,当外部系统上传文件时,文件会提前可见但仍在后台写入,以下是几种可靠的判断复制完成的方式:
检查文件大小是否稳定
复制过程中文件大小会持续增加,当大小连续几次检查都保持不变时,说明写入已完成。可以用如下脚本实现:#!/bin/bash FILE="/path/to/your/file" PREV_SIZE=0 STABLE_COUNT=0 # 连续3次大小相同则认为完成 while [ $STABLE_COUNT -lt 3 ]; do CURRENT_SIZE=$(stat -c %s "$FILE") if [ "$CURRENT_SIZE" -eq "$PREV_SIZE" ]; then STABLE_COUNT=$((STABLE_COUNT + 1)) else STABLE_COUNT=0 PREV_SIZE=$CURRENT_SIZE fi sleep 5 # 每5秒检查一次 done echo "File copy completed"使用lsof检查文件是否被进程占用
复制中的文件会被写入进程持有打开状态,通过lsof命令可以查看是否有进程在操作该文件:lsof /path/to/your/file如果命令没有输出,说明没有进程正在写入该文件,复制已完成。
监听文件的close_write事件(推荐)
利用inotifywait工具(需先安装inotify-tools包)监听文件的写入关闭事件,当文件完成写入并被关闭时,命令会自动退出:inotifywait -e close_write /path/to/your/file这种方式能精准捕获复制完成的瞬间,无需轮询,效率更高。
检查文件修改时间是否稳定
类似大小检查,复制过程中文件的修改时间(mtime)会不断更新,当mtime连续多次不变时,说明复制结束:#!/bin/bash FILE="/path/to/your/file" PREV_MTIME=0 STABLE_COUNT=0 while [ $STABLE_COUNT -lt 3 ]; do CURRENT_MTIME=$(stat -c %Y "$FILE") if [ "$CURRENT_MTIME" -eq "$PREV_MTIME" ]; then STABLE_COUNT=$((STABLE_COUNT + 1)) else STABLE_COUNT=0 PREV_MTIME=$CURRENT_MTIME fi sleep 5 done echo "File copy completed"
内容的提问来源于stack exchange,提问作者skolukmar
相关产品推荐
相关产品推荐

