查看: 158|回复: 0

centos 问什么每次重启都会产生 LOCK 文件 导致无法连接 vnc

[复制链接]

8

主题

2

回帖

32

积分

新手上路

积分
32
发表于 2026-10-7 08:14:50 | 显示全部楼层 |阅读模式
根本原因
TigerVNC 的Xvnc服务正常关机时没有可靠清理锁文件;当系统 reboot 时,systemd 的停止流程提前终止,来不及执行vncserver -kill,导致:

/tmp/.X1-lock
/tmp/.X11-unix/X1(display:1 为例)
~/.vnc/*.pid

这些锁文件残留在磁盘上。开机启动 VNC 时,检测到锁文件存在,误以为已经有 Xvnc 进程正在运行,拒绝启动 VNC 服务 → VNC 无法连接。

/tmp默认在 CentOS7 是 tmpfs 内存文件系统,正常关机应该清空;但如果你是systemd 服务停止顺序问题,或者用了自定义 vncserver@.service 单元、或者服务器是强制断电 / 硬重启,锁文件就会遗留。
重点:systemd 并行启动,VNC 服务启动时机过早,在 tmpfs 清理前就尝试启动,或者 stop 脚本执行失败。

临时手动清理(SSH 登录执行)
  1. # 替换:1为你的display号
  2. vncserver -kill :1
  3. rm -f /tmp/.X1-lock
  4. rm -f /tmp/.X11-unix/X1
  5. rm -f /root/.vnc/*.pid
  6. systemctl start vncserver@:1
复制代码

永久根治方案(推荐,二选一)

方案 1:修改 systemd service 单元,增加 ExecStartPre 清理锁(最标准)

编辑 service 文件,一般是 /etc/systemd/system/vncserver@.service

  1. [Service]
  2. Type=forking
  3. # 开机启动前,强制清理旧锁文件
  4. ExecStartPre=/bin/sh -c 'rm -f /tmp/.X%i-lock /tmp/.X11-unix/X%i; rm -f /root/.vnc/*.pid'
  5. ExecStart=/usr/bin/vncserver %i -geometry 1920x1080 -depth 24
  6. ExecStop=/usr/bin/vncserver -kill %i
  7. Restart=on-failure
复制代码
保存后重载 systemd:
  1. systemctl daemon-reload
  2. systemctl enable vncserver@:1
复制代码
原理:每次启动 VNC 服务**先删除对应 display 的锁文件**,再启动 Xvnc,直接规避残留锁问题。

方案 2:写开机脚本,开机阶段清理全部 X 锁

编辑 /etc/rc.local(CentOS7 需要保证 rc-local 启用)
  1. # 追加到 /etc/rc.d/rc.local
  2. rm -f /tmp/.X*-lock
  3. rm -rf /tmp/.X11-unix/*
复制代码
  1. chmod +x /etc/rc.d/rc.local
  2. systemctl enable rc-local
复制代码
排查额外坑点
1. 用户身份问题:如果不是 root 跑 vnc,锁文件在普通用户家目录~/.vnc/,rm命令要对应用户权限。
2. SELinux:少数情况 SELinux 阻止删除 /tmp 锁,临时关闭测试:setenforce 0
3. 不要混用手动 vncserver 命令 + systemd 服务。手动执行`vncserver :1`启动的会话,systemd 管理不到,重启更容易残留锁。统一只用 systemd 管理 vncserver@:1。
4. 查看 vnc 日志确认报错:cat /root/.vnc/主机名:1.log,里面会打印 lock 文件警告。
验证
修改完成后,执行reboot重启,重启后直接尝试 VNC 连接,不再报display is taken。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|沪ICP备2020032996号-2

在本版发帖
关注公众号
返回顶部