如何编写Bash脚本用jpeg2txt处理目录上传的JPEG文件?
基于Bash实现JPEG文件自动处理守护进程脚本
核心问题解答
- 守护进程 vs Cron:确实用后台循环的守护进程脚本更合适。Cron每分钟触发会导致多实例并行处理同一批文件,而守护进程可以自主控制检查间隔,避免重复执行,还能实时响应新文件。
- 避免处理未完成上传的文件:最实用的方法是尝试重命名文件——FTP上传中的文件会被进程锁定,无法完成重命名,以此判断文件是否上传完成;也可搭配检查文件修改时间,确保文件在一段时间内没有变动。
完整脚本实现
#!/bin/bash # 配置参数 SOURCE_DIR="/path/to/your/source" TARGET_DIR="/path/to/your/target" SLEEP_INTERVAL=10 # 每次检查间隔(秒) WAIT_STABLE_TIME=5 # 文件修改后等待稳定的时间(可选) # 确保目标目录存在 mkdir -p "$TARGET_DIR" # 持续循环检查 while true; do # 遍历源目录下的JPEG文件(兼容.jpg/.jpeg) for img in "$SOURCE_DIR"/*.{jpg,jpeg} 2>/dev/null; do # 跳过不存在的文件(目录无JPEG时通配符会保留原样) [ -f "$img" ] || continue # 步骤1:尝试重命名文件,判断是否被占用 temp_file="$SOURCE_DIR/.processing_$(basename "$img")" if ! mv "$img" "$temp_file"; then # 重命名失败,说明文件正在上传,跳过 continue fi # 步骤2(可选):等待文件修改时间稳定,确保上传完成 while [ $(( $(date +%s) - $(stat -c %Y "$temp_file") )) -lt "$WAIT_STABLE_TIME" ]; do sleep 1 done # 生成输出文件名(去掉原后缀,改为.txt) base_name=$(basename "$temp_file" | sed 's/\.processing_//' | sed 's/\.[^.]*$//') output_file="$TARGET_DIR/$base_name.txt" # 步骤3:执行jpeg2txt处理 if jpeg2txt "$temp_file" > "$output_file"; then # 处理成功,删除临时文件 rm "$temp_file" echo "$(date '+%Y-%m-%d %H:%M:%S') 处理完成:$img -> $output_file" else # 处理失败,恢复原文件,留待下次重试 mv "$temp_file" "$img" echo "$(date '+%Y-%m-%d %H:%M:%S') 处理失败,恢复原文件:$img" fi done # 等待下一次检查 sleep "$SLEEP_INTERVAL" done
脚本关键逻辑说明
- 文件占用判断:通过
mv命令尝试将原文件重命名为临时文件,若失败则说明文件正被FTP进程占用,直接跳过。这是最可靠的轻量判断方式。 - 文件稳定检查:可选的等待逻辑,确保文件修改时间在
WAIT_STABLE_TIME秒内没有变化,进一步避免处理未完全上传的文件。 - 错误恢复:如果
jpeg2txt处理失败,会将临时文件恢复为原名称,避免丢失待处理文件。 - 空格兼容:所有路径变量都用双引号包裹,支持带空格的文件名和目录。
脚本运行与管理
后台启动脚本
# 赋予执行权限 chmod +x ./jpeg_processor.sh # 后台运行,退出终端后仍保持运行 nohup ./jpeg_processor.sh > ./processor.log 2>&1 &
配置为系统服务(推荐)
创建/etc/systemd/system/jpeg-processor.service文件:
[Unit] Description=JPEG to Text Auto Processor After=network.target [Service] User=your_username ExecStart=/path/to/your/jpeg_processor.sh Restart=always RestartSec=5 StandardOutput=append:/var/log/jpeg-processor.log StandardError=append:/var/log/jpeg-processor.log [Install] WantedBy=multi-user.target
然后执行以下命令启用服务:
sudo systemctl daemon-reload sudo systemctl enable --now jpeg-processor.service # 查看服务状态 sudo systemctl status jpeg-processor.service
内容的提问来源于stack exchange,提问作者Leszek Pachura
相关产品推荐
相关产品推荐

