Ubuntu监控PDF目录自动合并脚本故障及批量触发问题求助
问题与修复方案
需求说明
- 创建目录并监控其中PDF文件
- 有PDF添加时触发脚本,等待30秒确保复制完成后,用
pdfunite合并为MERGED.pdf并删除源文件 - 若
MERGED.pdf已存在则不执行任何操作,需用户删除该文件后才能启动新合并流程
现有脚本故障点
- 监控脚本重复触发:每次创建文件都会启动一个新的
merge_script.sh实例,批量添加多个文件会生成多个脚本进程,互相干扰导致逻辑混乱 - 合并脚本逻辑缺陷:
- 使用
ls $dir/*.pdf | wc -l统计PDF数量,若文件名含空格会统计错误 - 脚本本身是死循环,多个实例同时运行会重复执行合并/删除操作
- 等待逻辑不合理,在循环中反复判断并sleep,浪费资源且时机错误
- 使用
修复后的脚本
1. 监控脚本(monitor_pdf.sh)
#!/bin/bash dir="/path/to/directory" merge_script="/path/to/merge_script.sh" # 确保监控目录存在 mkdir -p "$dir" # 监控目录,仅处理PDF文件且避免重复触发合并脚本 while true; do inotifywait -e create "$dir" | while read path action file; do # 仅对PDF文件触发操作 if [[ "$action" == "CREATE" && "$file" =~ \.pdf$ ]]; then # 检查合并脚本是否正在运行,防止重复启动 if ! pgrep -f "$merge_script" > /dev/null; then "$merge_script" & fi fi done done
2. 合并脚本(merge_script.sh)
#!/bin/bash dir="/path/to/directory" merged_file="$dir/MERGED.pdf" # 如果MERGED.pdf已存在,直接退出 if [[ -f "$merged_file" ]]; then exit 0 fi # 等待30秒,确保文件复制完成 sleep 30 # 安全统计PDF文件数量(排除已存在的MERGED.pdf) pdf_count=$(find "$dir" -maxdepth 1 -type f -name "*.pdf" ! -name "MERGED.pdf" | wc -l) # 只有PDF数量≥2时才执行合并操作 if [[ "$pdf_count" -ge 2 ]]; then # 合并所有PDF文件(按文件名排序保证顺序稳定) pdfunite $(find "$dir" -maxdepth 1 -type f -name "*.pdf" ! -name "MERGED.pdf" | sort) "$merged_file" # 删除源PDF文件 find "$dir" -maxdepth 1 -type f -name "*.pdf" ! -name "MERGED.pdf" -delete fi
脚本说明
- 监控脚本:添加PDF后缀过滤,避免非PDF文件触发;通过
pgrep确保同一时间只有一个合并脚本进程,彻底解决批量添加时重复触发的问题 - 合并脚本:去掉死循环改为单次执行;用
find替代ls处理带空格的文件名;先判断MERGED.pdf是否存在,存在直接退出;等待30秒后再统计文件数量,确保复制操作完成;合并时对文件排序,保证合并顺序稳定
使用步骤
- 将两个脚本中的
/path/to/directory替换为实际监控目录路径 - 给脚本添加执行权限:
chmod +x monitor_pdf.sh merge_script.sh - 将监控脚本加入cron开机启动:
@reboot /path/to/monitor_pdf.sh >> /var/log/pdf_merge.log 2>&1
内容的提问来源于stack exchange,提问作者ECII
相关产品推荐
相关产品推荐

