Files
dify_market_manager_gui/LOCK_FILE_FIX.md

4.9 KiB
Raw Blame History

锁文件和缓存问题修复说明

问题描述

运行 npm run dev 时遇到以下问题:

  1. 锁文件被占用EBUSY: resource busy or locked, unlink 'lockfile'
  2. 单实例检查失败:即使锁文件无效,也无法启动新实例
  3. 缓存错误Unable to move the cache: 拒绝访问Failed to delete the database

问题原因分析

  1. 文件占用:锁文件被其他进程占用,无法删除
  2. 进程检查不准确:锁文件中的 PID 为 NaN导致进程检查失败
  3. 缓存冲突:多个实例同时访问缓存目录导致冲突
  4. 权限问题:某些文件需要管理员权限才能删除

修复内容

1. 改进锁文件删除机制 (src/main/utils/singleInstance.js)

  • 添加 safeDeleteFile() 方法,处理文件被占用的情况
  • 在 Windows 上使用 del /F /Q 命令强制删除
  • 改进错误处理和日志记录

2. 智能单实例检查

  • 检查是否有实际的窗口存在,而不仅仅依赖锁文件
  • 如果找不到现有窗口,允许强制启动新实例
  • 添加详细的日志记录

3. 缓存清理和配置 (src/main/index.js)

  • 添加缓存相关命令行参数
  • 在应用启动时清理缓存目录
  • 避免缓存冲突

4. 托盘菜单增强 (src/main/tray.js)

  • 改进"清理实例锁"功能,处理文件占用情况
  • 添加"强制重启应用"选项
  • 提供更安全的文件删除机制

5. 测试脚本 (test-lock-cleanup.js)

  • 提供锁文件清理功能的测试
  • 验证文件删除机制
  • 帮助调试锁文件问题

修复后的功能特点

安全的文件删除

  1. 多重尝试:首先尝试直接删除,失败后使用系统命令
  2. 错误处理:区分不同类型的错误,提供相应的解决方案
  3. 日志记录:详细记录删除过程和结果

智能启动逻辑

  1. 窗口检查:检查是否有实际的窗口存在
  2. 强制启动:如果锁文件无效且无窗口,允许强制启动
  3. 详细日志:记录每个决策步骤

缓存管理

  1. 启动时清理:应用启动时自动清理缓存目录
  2. 命令行配置:添加缓存相关配置避免冲突
  3. 错误处理:处理缓存清理过程中的错误

使用方法

自动修复

  1. 重新运行 npm run dev
  2. 应用会自动处理锁文件和缓存问题
  3. 如果锁文件被占用,会尝试强制删除

手动清理

  1. 右键点击托盘图标
  2. 选择"清理实例锁"或"强制重启应用"
  3. 查看日志确认操作结果

测试功能

# 测试锁文件清理功能
node test-lock-cleanup.js

修复后的启动流程

正常启动

[时间] 开始检查单实例锁...
[时间] 发现锁文件: [路径]
[时间] 进程 [PID] 不存在,尝试删除无效锁文件
[时间] 成功删除文件: [路径]
[时间] 单实例锁检查结果: true
[时间] 这是第一个实例,继续启动
[时间] 应用已准备就绪,开始初始化...
[时间] 清理缓存目录: [路径]
[时间] 缓存目录清理完成: [路径]

锁文件被占用

[时间] 发现锁文件: [路径]
[时间] 文件被占用,无法删除: [路径]
[时间] 使用 del 命令删除文件: [路径]
[时间] 单实例锁检查结果: true
[时间] 这是第一个实例,继续启动

强制启动

[时间] 单实例锁检查结果: false
[时间] 检测到已有实例运行
[时间] 未找到现有实例窗口,可能是锁文件问题,允许强制启动
[时间] 这是第一个实例,继续启动

常见问题解决

1. 锁文件仍然无法删除

  1. 使用托盘菜单的"强制重启应用"功能
  2. 手动删除锁文件:
    del /F /Q "C:\Users\[用户名]\AppData\Roaming\market-manager-gui\lockfile"
    
  3. 重启开发环境

2. 缓存错误仍然存在

  1. 手动清理缓存目录:
    rmdir /S /Q "C:\Users\[用户名]\AppData\Roaming\market-manager-gui\Cache"
    rmdir /S /Q "C:\Users\[用户名]\AppData\Roaming\market-manager-gui\Code Cache"
    
  2. 以管理员身份运行应用

3. 权限问题

  1. 以管理员身份运行命令提示符
  2. 手动删除相关文件
  3. 检查文件权限设置

注意事项

1. 开发环境

  • 在开发过程中,锁文件和缓存可能会频繁创建和删除
  • 如果遇到问题,使用托盘菜单的清理功能
  • 查看日志文件获取详细信息

2. 生产环境

  • 确保应用正常退出时能清理锁文件
  • 监控缓存目录的大小
  • 定期检查是否有无效锁文件

3. 调试建议

  • 使用 test-lock-cleanup.js 脚本测试文件删除功能
  • 查看日志文件了解锁文件和缓存的状态
  • 使用托盘菜单的手动清理功能

相关文件

  • src/main/utils/singleInstance.js - 单实例锁管理工具(已更新)
  • src/main/index.js - 主进程启动文件(已更新)
  • src/main/tray.js - 托盘功能(已更新)
  • test-lock-cleanup.js - 锁文件清理测试脚本