AlmaLinux下Laravel多站点缓存清理Bash脚本卡在-type d步骤求助
解决Laravel站点批量清理脚本卡在find命令的问题
问题分析
400+站点规模下,原脚本依赖find -type d遍历所有目录判断Laravel结构,容易出现以下问题:
- 遍历范围过大(比如包含系统目录、无关子目录),导致耗时极长被误认为卡住
- 遇到权限不足的目录时,find会阻塞等待,无法继续
- 日志输出逻辑缺失或错误,导致无日志生成
排查与修复步骤
1. 替换低效的find遍历逻辑
直接遍历站点根目录,逐个判断是否为Laravel项目(依赖artisan文件和storage/framework目录这两个核心标识),避免全局目录遍历:
#!/bin/bash # 配置参数 LOG_FILE="/var/log/laravel_cache_cleanup.log" SITES_ROOT="/var/www/sites" # 替换为你的站点根目录 # 初始化日志文件 > "$LOG_FILE" # 遍历所有站点目录 for site_dir in "$SITES_ROOT"/*; do # 跳过非目录项 [ -d "$site_dir" ] || continue # 判断是否为Laravel项目 if [ -f "$site_dir/artisan" ] && [ -d "$site_dir/storage/framework" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理Laravel站点: $site_dir" >> "$LOG_FILE" # 进入站点目录执行清理命令 cd "$site_dir" || { echo "[$(date '+%Y-%m-%d %H:%M:%S')] 无法进入目录: $site_dir" >> "$LOG_FILE" continue } # 执行Laravel清理命令,输出重定向到日志 php artisan cache:clear >> "$LOG_FILE" 2>&1 php artisan view:clear >> "$LOG_FILE" 2>&1 php artisan route:clear >> "$LOG_FILE" 2>&1 echo "[$(date '+%Y-%m-%d %H:%M:%S')] 站点 $site_dir 清理完成" >> "$LOG_FILE" else echo "[$(date '+%Y-%m-%d %H:%M:%S')] 跳过非Laravel目录: $site_dir" >> "$LOG_FILE" fi done echo "[$(date '+%Y-%m-%d %H:%M:%S')] 批量清理任务执行完毕" >> "$LOG_FILE"
2. 解决日志不生成问题
- 确保
LOG_FILE指定的路径存在,且运行脚本的用户有写入权限(比如用sudo chown your_user:your_group /var/log/laravel_cache_cleanup.log) - 脚本中所有输出都通过
>> "$LOG_FILE" 2>&1重定向,确保错误信息也能写入日志
3. 排查卡住的其他可能原因
- 权限问题:运行脚本的用户需对所有站点目录有读权限,可在遍历前添加权限检查,或用
find时跳过无权限目录:find "$SITES_ROOT" -type d \( ! -perm /u+r \) -prune -o -name "artisan" -print - 资源不足:运行脚本时用
top/htop监控CPU、内存占用,若资源耗尽,可分批次清理站点(比如每次处理50个) - 调试模式:在脚本开头添加
set -x,运行后会输出每一步的执行细节,直接定位卡住的环节
验证方法
- 先手动在单个Laravel站点执行
php artisan cache:clear等命令,确认命令能正常运行 - 运行优化后的脚本,实时查看日志:
tail -f /var/log/laravel_cache_cleanup.log,确认是否正常执行 - 若仍有问题,检查系统挂载的远程目录(如果有),避免find遍历远程文件系统导致阻塞
内容的提问来源于stack exchange,提问作者Haris Durrani
相关产品推荐
相关产品推荐

