Ubuntu下Forge服务器session.lock锁文件残留导致MC1.21.1启动失败的排查与解决

张开发
2026/5/27 8:23:26 15 分钟阅读
Ubuntu下Forge服务器session.lock锁文件残留导致MC1.21.1启动失败的排查与解决
1. 问题现象与初步分析上周在Ubuntu 20.04上部署Forge版MC1.21.1服务器时遇到了个典型问题用kill命令强制终止服务后再次启动时报错session.lock: already locked。这个锁文件残留问题其实很常见但新手容易手足无措。我花了三小时完整排查最终发现是Linux进程管理和文件锁机制的特性导致的。错误日志中最关键的是这两行[main/ERROR] [minecraft/Main]: Failed to start the minecraft server net.minecraft.util.DirectoryLock$LockException: /world/session.lock: already locked这就像你去图书馆借书前一个人没办手续就直接离开异常退出系统还记录着书已被借出的状态。MC的session.lock机制也是如此它通过这个锁文件确保同一时间只有一个服务器实例能访问世界数据。当服务器异常退出时这个借书记录没被正常清除。2. 深入理解session.lock机制2.1 Minecraft的锁文件原理MC服务器启动时会在world目录创建session.lock这个文件本质是个占位符。其工作原理类似会议室预约表服务器启动时检查是否存在session.lock若无则创建并写入进程ID等元数据正常关闭时自动删除该文件异常退出时文件残留Forge在1.21.1版本中强化了这个机制错误提示更明确。实测发现该文件内容其实是JSON格式{ pid: 20163, time: 1719874567 }2.2 Linux进程残留的常见原因用kill命令终止Java进程时这些情况会导致残留直接kill -9强制终止相当于拔电源子进程未正确回收常见于screen/tmux环境JVM的shutdown hook未执行完可以通过ps -ef | grep java查看残留进程。我遇到过最隐蔽的情况是僵尸进程状态为Z这种需要用kill -HUP处理。3. 完整排查流程3.1 第一步检查Java进程状态别急着删文件先确认是否有隐藏进程# 精确查找Forge进程 ps aux | grep forge-1.21.1 | grep -v grep # 更全面的Java进程检查 jps -l # 需要JDK环境如果输出类似这样20163 java -Xmx5G -jar forge-1.21.1-xxx.jar说明确实有残留进程需要用kill -15 20163尝试优雅终止。3.2 第二步验证文件锁持有者Linux下可以用lsof查文件占用情况sudo lsof /path/to/world/session.lock典型输出COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 123 root 12uW REG 252,1 0 4567 session.lock如果显示被其他进程占用需要先处理对应进程。3.3 第三步安全删除锁文件确认无残留进程后建议先备份再删除# 备份原文件 cp /world/session.lock /tmp/session.lock.bak # 删除前检查文件属性 ls -lh /world/session.lock # 执行删除 rm -v /world/session.lock4. 预防措施与最佳实践4.1 正确的服务启停方式建议使用systemd服务管理# /etc/systemd/system/mc.service [Unit] DescriptionMinecraft Forge Server [Service] Userminecraft WorkingDirectory/opt/minecraft ExecStart/usr/bin/java -Xmx5G -jar forge-1.21.1-xxx.jar Restarton-failure [Install] WantedBymulti-user.target管理命令sudo systemctl start mc # 启动 sudo systemctl stop mc # 优雅停止4.2 自动化清理脚本创建/usr/local/bin/clean-mc-lock#!/bin/bash LOCK_FILE/opt/minecraft/world/session.lock if [ -f $LOCK_FILE ]; then echo Found existing lock file, checking processes... if ! pgrep -f forge-1.21.1; then echo No running MC process, removing lock rm -v $LOCK_FILE else echo MC process still running, aborting exit 1 fi fi记得给执行权限chmod x /usr/local/bin/clean-mc-lock4.3 监控与告警设置配置Prometheus监控示例# mc_exporter.yml rules: - alert: StaleMinecraftLock expr: time() - file_mtime(/opt/minecraft/world/session.lock) 3600 for: 5m labels: severity: warning annotations: summary: MC锁文件超过1小时未更新5. 高级故障排查5.1 使用strace追踪当问题复杂时可以用strace分析strace -f -o mc_strace.log java -jar forge-1.21.1-xxx.jar重点观察这些系统调用openat文件打开flock文件锁操作unlink文件删除5.2 分析JVM转储如果怀疑JVM问题可以生成线程转储jstack pid mc_thread_dump.log查找DirectoryLock相关线程状态。5.3 文件系统检查某些情况下需要验证文件系统# 检查inode状态 stat /world/session.lock # 查看挂载选项 mount | grep minecraft # 必要时修复权限 chown -R minecraft:minecraft /world6. 其他可能性排查遇到过NFS挂载的世界目录会出现特殊锁问题这时需要# 查看NFS锁状态 nfsiostat sm-notify # 强制解锁 /sbin/nfsdcld -f对于ext4文件系统可以尝试# 检查文件系统错误 fsck /dev/vdb1 # 禁用atime更新 mount -o remount,noatime /world最后提醒定期备份世界目录很重要。我习惯用这个命令创建时间戳备份tar -zcvf world_$(date %Y%m%d_%H%M).tar.gz world/

更多文章