马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
VNC 连上去一片黑、或者鼠标键盘没反应,服务明明还在跑——这种「假死」状态在重启过服务器的机器上特别常见。定位思路其实很固定:先看服务状态,再看日志 里的错误码,最后按码找进程。
故障现象
- 服务器重启之后 VNC 连不上。
- 明明
ps 里能看到 VNC 相关进程,端口也监听着。
- 客户端连上了但显示黑屏,或者报「连接被对端重置」。
排查五步
第一步:重启服务,看报不报错误
sudo systemctl restart vncserver@:1.service
如果这里就报失败,别往下走,问题在启动阶段。
第二步:看服务状态
systemctl status vncserver@:1.service
状态是 inactive(未启动)或者 failed,说明服务压根没起来。
第三步:翻日志 找错误码
journalctl -u vncserver@:1.service
日志 里出现 status=98 这样的字样——98 是 systemd 的「地址已被占用」错误码,对应 Address already in use,意思很直白:VNC 想监听的那个端口已经被别人占着了。
为什么会被占?因为 VNC 通常配了开机自启,系统重启过程中 systemd 并发拉起了多个会话实例,或者上一次的进程没被正确回收,端口一直挂着不放。
第四步:找出占端口的进程
sudo lsof -i:5901
VNC 的端口号换算规则:会话 :1 对应 5901,:2 对应 5902,依此类推。输出里能看到占着 5901 的进程 PID 和命令。
第五步:清掉进程再起服务
sudo kill 902149
sudo systemctl restart vncserver@:1.service
systemctl status vncserver@:1.service
状态回到 active (running),客户端重新连一次就正常了。
kill 默认发 SIGTERM, gracefully 让进程自己收尾;实在收不掉再上 kill -9。生产环境别一上来就 -9。
顺手解决根因:别让它再卡住
这次是进程卡住,那下次重启还会。两个加固动作:
- 确认自启的是你想要的那个实例:
systemctl list-unit-files | grep vncserver,以及 systemctl is-enabled vncserver@:1。开了多个会话自启,重启时就会互相抢端口。
- 给自启服务加依赖约束:在
/etc/systemd/system/vncserver@:1.service.d/ 下放一个 override,让它在 network-online.target 之后才起,避免网络没就绪时抢端口:
sudo systemctl edit vncserver@:1.service
[Unit]
After=network-online.target
Wants=network-online.target
改完 sudo systemctl daemon-reload 生效。
其他常见黑屏原因对照
- 桌面环境没装全:只装了
openvnc-server 但没有 xfce4 / xterm,X Display 起不来就是纯黑。用 tigervnc 的话检查 Xvnc 是否装了基础字体。
- 分辨率或色深配置错:
~/.vnc/config 里写太大的分辨率,老显卡驱动下会黑。调成 1280x1024 试试。
- 用户家目录权限太开:
~/.vnc/xstartup 必须可执行(chmod +x),而且 ~/.vnc 权限别搞成 777。
- 防火墙挡了 5901:
sudo ufw allow 5901/tcp。
- SSH 隧道断了:走 SSH 隧道连 VNC 的场景,隧道断了表现也是黑屏,
ssh -v 看一下隧道还在不在。
回到这次的故障:根因是 VNC 配了开机自启,重启时进程卡住没被回收,端口 5901 一直被占,新实例自然起不来,表现为连接黑屏。按「状态 → 日志 → 错误码 → 端口进程」这条链走一遍,基本都能秒定位。
qidao123.com企服评测-应用市场 编辑提示 |