Ubuntu 16.04部署TigerVNC远程桌面实战指南
1. 项目概述:为什么在 Ubuntu 16.04 上部署 VNC 远程桌面仍是刚需场景
VNC(Virtual Network Computing)不是过时技术,而是 Linux 系统远程图形化操作最稳定、最轻量、最可控的底层方案之一。尤其在 Ubuntu 16.04 这个长期支持(LTS)版本上,它仍被大量部署于嵌入式开发调试环境、老旧服务器维护终端、教育实验室机房、工业控制前置机以及离线科研计算节点中——这些场景共同特点是:不依赖云服务、拒绝频繁升级、强调确定性行为、需保留完整桌面交互能力,且网络带宽有限或不可靠。我过去三年里参与的 7 个边缘计算项目中,有 5 个明确要求必须基于 Ubuntu 16.04 + TightVNC 或 TigerVNC 构建远程维护通道,原因很实在:系统镜像固化后不允许变更内核模块,而 Wayland 显示协议在 16.04 中尚未进入主线,X11 是唯一可稳定接管的显示子系统;同时,SSH 转发 X11 应用仅支持单窗口,无法满足用户需要完整 GNOME 桌面、多终端协同、剪贴板同步、文件拖拽等真实办公级交互需求。VNC 在这里不是“替代方案”,而是“不可绕过的基础设施”。你可能正面对一台放在机柜深处、没有显示器和键盘的工控主机,或者一台运行着定制化 Python 数据采集脚本的树莓派集群节点,又或者一台用于教学演示、需被多名学生轮换登录的实验室电脑——这些都不是 Docker 容器能解决的问题,也不是 Web SSH 终端能覆盖的体验。VNC 提供的是像素级的、与本地操作无感差异的远程桌面,它把物理距离彻底抹平。而 Ubuntu 16.04 的价值在于其内核(4.4)、systemd(229)、GNOME(3.18)三者组合经过了五年以上高强度生产验证,稳定性远超后续版本。所以这不是怀旧,是工程选型:当你要在无人值守环境下保证三年零重启的远程可维护性时,Ubuntu 16.04 + VNC 就是那个“虽然不新,但绝对不掉链子”的答案。
2. 整体设计思路与方案选型逻辑:为什么不用 x11vnc、noVNC 或 RealVNC
在 Ubuntu 16.04 上实现 VNC 远程桌面,表面看只是执行几条apt install命令,实则是一场对系统架构、安全边界、资源占用与交互质量的综合权衡。我见过太多人直接sudo apt install vnc4server后发现无法启动 GNOME、黑屏、键盘失效、剪贴板不同步,最后放弃转投 TeamViewer——问题从来不在 VNC 协议本身,而在服务端实现与桌面环境的耦合方式。我们最终锁定TigerVNC作为核心服务端,而非更常见的 TightVNC 或 x11vnc,理由非常具体:
第一,TigerVNC 是 TightVNC 的高性能分支,专为现代 X11 优化,其vncserver工具原生支持-localhost no和-geometry参数,无需额外 patch 就能绕过 Ubuntu 16.04 默认的localhost-only绑定限制;而 TightVNC 0.9.x(Ubuntu 16.04 仓库版本)的vncserver脚本硬编码了127.0.0.1,修改配置文件后仍会因xauth权限问题失败,这是我在某电力 SCADA 系统现场踩过的坑。
第二,x11vnc 虽然能直接挂载当前正在运行的 X session(即“共享桌面”模式),但它本质是 X server 的屏幕抓取器,所有输入事件需经 X server 重放,导致鼠标移动延迟高、快捷键(如 Ctrl+Alt+T)常被本地系统截获,在多用户切换场景下极易冲突;更重要的是,x11vnc 无法为每个用户创建独立会话,违反最小权限原则——运维人员 A 登录后,B 就无法再连接,这在实验室多学生轮用场景中是硬伤。
第三,RealVNC 商业版虽功能完整,但其免费版(RealVNC Personal Edition)在 Ubuntu 16.04 上存在 GTK3 兼容性问题,启动时提示GLib-GObject-CRITICAL **: g_object_set_qdata: assertion 'G_IS_OBJECT (object)' failed,且其 systemd 服务模板未适配 Ubuntu 16.04 的 systemd 229 版本,RestartSec=10参数被忽略,进程崩溃后无法自动恢复。
第四,noVNC(Web-based VNC)看似时髦,但它依赖 WebSocket 代理(如 websockify),在 Ubuntu 16.04 上编译 Python 3.5+ 的依赖链极脆弱,pip install websockify会触发setuptools版本冲突,而降级 setuptools 又会导致apt包管理器异常——这种“为图方便反增复杂度”的方案,在生产环境中得不偿失。
因此,我们的整体设计是:以 TigerVNC 为 VNC 协议栈核心,以~/.vnc/xstartup为桌面环境启动入口,以 systemd user service 实现用户级守护,以ufw配置最小化端口暴露,最终构建一个与系统解耦、可独立启停、资源占用低于 35MB、支持多用户并发、且完全兼容 GNOME Flashback(即传统 Metacity 桌面)的轻量级远程桌面通道。这个方案不追求炫酷界面,只确保在断网 2 小时后重连,桌面状态依然如初,鼠标指针精准响应,Ctrl+C/V 剪贴板秒同步——这才是工程师要的“稳”。
3. 核心细节解析与实操要点:从安装到首次成功登录的 7 个关键动作
VNC 在 Ubuntu 16.04 上的部署失败,90% 源于对几个关键细节的忽视。这些细节不是文档里泛泛而谈的“编辑配置文件”,而是直接影响能否看到桌面、能否输入文字、能否传输文件的真实障碍点。下面我逐条拆解从apt install到第一次成功登录的全部核心动作,每一步都附带原理说明和避坑提示。
3.1 安装 TigerVNC 并验证基础依赖
Ubuntu 16.04 官方仓库中的 TigerVNC 版本是 1.3.1,足够稳定,无需自行编译。执行以下命令:
sudo apt update sudo apt install tigervnc-standalone-server tigervnc-xorg-extension tigervnc-viewer注意:必须同时安装tigervnc-xorg-extension。这个包提供vnc.soX11 扩展模块,若缺失,vncserver启动时会报错Failed to load module "vnc",桌面直接黑屏。我曾在一个金融客户现场耗时 4 小时排查此问题,最终发现他们使用的是精简版 Ubuntu 镜像,xorg-extension类包被批量移除。
安装后验证是否识别到 VNC 模块:
ls /usr/lib/xorg/modules/extensions/ | grep vnc # 正常应输出:vnc.so提示:不要安装
vnc4server或tightvncserver。它们与 TigerVNC 的vncserver二进制文件同名,PATH冲突会导致后续命令调用错误版本,出现Couldn't start Xvnc process等模糊错误。
3.2 为用户生成初始 VNC 密码并理解其存储机制
VNC 认证密码并非明文存储,而是通过vncpasswd工具加密后写入~/.vnc/passwd文件。执行:
vncpasswd它会提示你输入两次密码(长度至少 6 位),并询问是否设置“仅查看”模式(view-only)。务必选择n(否),否则你将无法使用键盘和鼠标。
关键细节:vncpasswd生成的passwd文件权限必须是600,否则vncserver启动时会拒绝读取并静默失败。检查命令:
ls -l ~/.vnc/passwd # 正确输出:-rw------- 1 username username 8 ... .vnc/passwd若权限不对,立即修复:
chmod 600 ~/.vnc/passwd注意:这个密码与你的系统登录密码完全无关。它是 VNC 协议层的独立认证凭证,用于建立 RFB(Remote Frame Buffer)连接。VNC Viewer 客户端连接时输入的,就是这个密码。
3.3 创建并严格校验~/.vnc/xstartup启动脚本
这是整个部署中最容易出错、也最关键的环节。xstartup脚本定义了 VNC 会话启动时加载的桌面环境。Ubuntu 16.04 默认桌面是 Unity,但 Unity 严重依赖compiz合成器和dconf后端,在 VNC 虚拟 X server 中极易崩溃。我们必须降级到轻量、稳定、无依赖的 GNOME Flashback(即传统 GNOME 2 风格)。
创建~/.vnc/xstartup文件:
mkdir -p ~/.vnc nano ~/.vnc/xstartup填入以下内容(逐字复制,不可省略任何一行):
#!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS export XKL_XMODMAP_DISABLE=1 exec /etc/X11/Xsession /usr/bin/gnome-session --session=gnome-flashback-metacity解释每一行的作用:
unset SESSION_MANAGER:防止 GNOME Session Manager 尝试连接本地 D-Bus,避免Could not acquire name on session bus错误;unset DBUS_SESSION_BUS_ADDRESS:同上,强制 GNOME 使用独立的 D-Bus 实例;export XKL_XMODMAP_DISABLE=1:禁用 X Keyboard Extension 的自动映射,解决 VNC Viewer 中中文输入法失效问题;exec /etc/X11/Xsession ...:使用系统标准 X session 启动器,确保环境变量(如PATH)正确加载;gnome-session --session=gnome-flashback-metacity指定启动 GNOME Flashback 桌面,而非默认的 Unity。
保存后赋予可执行权限:
chmod +x ~/.vnc/xstartup提示:网上很多教程推荐使用
startxfce4或twm,前者在 Ubuntu 16.04 上需额外安装xfce4包(约 120MB),后者无任务栏和菜单,实用性极低。GNOME Flashback 是 Ubuntu 16.04 仓库自带、零额外依赖、界面熟悉、功能完整的最优解。
3.4 配置防火墙(UFW)开放 VNC 端口
VNC 默认使用5900 + display number端口。例如,vncserver :1使用5901端口。Ubuntu 16.04 默认启用 UFW,必须显式放行:
sudo ufw allow 5901 # 若需多用户,依次放行 5902, 5903...验证规则是否生效:
sudo ufw status verbose | grep 590 # 应输出:5901 ALLOW IN Anywhere注意:不要开放
5900端口。5900是 X server 的默认显示端口,直接暴露风险极高,且 VNC 服务不会监听此端口。
3.5 启动 VNC 服务并捕获首次启动日志
现在可以启动服务了。使用:1作为 display number(对应端口5901):
vncserver :1 -geometry 1366x768 -depth 24参数说明:
:1:display number,决定端口号(5900+1=5901);-geometry 1366x768:设置虚拟桌面分辨率,必须指定,否则默认1024x768过小;-depth 24:设置色深为 24 位(真彩色),避免 GTK 应用颜色失真。
首次启动会生成~/.vnc/hostname:1.log日志文件。务必立即检查该日志:
tail -n 20 ~/.vnc/$(hostname):1.log正常启动的末尾应包含:
Connections: accepted: [client-ip]:xxxxx SConnection: closed: [client-ip]:xxxxx若出现Fatal server error: (EE) Cannot establish any listening sockets,说明端口被占用;若出现Couldn't start Xvnc process,大概率是xstartup权限或内容错误;若出现gnome-session[xxxx]: CRITICAL: Unable to connect to D-Bus,则是xstartup中unset DBUS...行缺失。
3.6 从 Windows/macOS 客户端连接并解决首屏黑屏
使用官方 VNC Viewer(https://www.realvnc.com/en/connect/download/viewer/)或 TigerVNC Viewer 连接your-server-ip:5901。输入vncpasswd设置的密码。
首次连接常见问题是纯黑屏,但鼠标箭头可见且可移动。这不是服务没起来,而是桌面环境未正确加载。此时不要关闭客户端,保持连接,SSH 回服务器,检查:
ps aux | grep gnome-session # 应看到类似:username 12345 0.5 2.1 1234567 89012 ? S 10:00 0:05 /usr/bin/gnome-session --session=gnome-flashback-metacity若无此进程,说明xstartup执行失败。最快速修复法:手动执行一次:
DISPLAY=:1 /usr/bin/gnome-session --session=gnome-flashback-metacity &然后在 VNC Viewer 中按F8调出菜单,选择Send Ctrl+Alt+Backspace强制重启 X session。
3.7 验证核心交互功能:剪贴板与文件传输
VNC 协议原生支持剪贴板同步(RFBClientCutText/ServerCutText),但需客户端和服务端均启用。TigerVNC 默认开启,只需在 VNC Viewer 客户端设置中勾选Clipboard→Enable clipboard sharing。
测试方法:在本地 Windows 复制一段文字(Ctrl+C),在 VNC 桌面中打开gedit,按 Ctrl+V 粘贴。若失败,检查服务器端xstartup是否遗漏unset SESSION_MANAGER—— 这是 GNOME 剪贴板守护进程冲突的主因。
文件传输需借助第三方工具,因为 VNC 协议本身不定义文件传输。推荐使用scp命令行(最可靠)或FileZilla(GUI,需在 VNC 桌面中安装):
# 从本地上传文件到 VNC 用户家目录 scp myfile.txt username@your-server-ip:~/Desktop/实操心得:我坚持在所有客户现场部署时,都在
~/.vnc/xstartup末尾追加一行gnome-terminal &,确保每次连接后自动弹出终端窗口。这省去了在黑屏状态下盲按Alt+F2输入gnome-terminal的痛苦,是提升一线运维效率的微小但关键的细节。
4. 实操过程与核心环节实现:构建可复用、可维护的 systemd 用户服务
手动执行vncserver :1只能解决临时需求,生产环境必须实现开机自启、崩溃自恢复、用户隔离、日志归档。Ubuntu 16.04 的 systemd 版本(229)已支持userscope 服务,这是最佳实践路径。下面我们将vncserver封装为一个健壮的 systemd user service,整个过程可完全复用,只需替换用户名和 display number。
4.1 创建 systemd user service 单元文件
systemd user service 必须存放在用户家目录下,路径为~/.config/systemd/user/。创建该目录(若不存在):
mkdir -p ~/.config/systemd/user/创建服务文件~/.config/systemd/user/vncserver@.service(注意@符号,表示模板服务):
[Unit] Description=Start TigerVNC server at startup After=syslog.target network.target [Service] Type=forking User=%i PAMName=login PIDFile=/home/%i/.vnc/%H:%i.pid ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :%i > /dev/null 2>&1 || :' ExecStart=/usr/bin/vncserver :%i -geometry 1366x768 -depth 24 -localhost no ExecStop=/usr/bin/vncserver -kill :%i Restart=always RestartSec=10 StartLimitInterval=0 [Install] WantedBy=default.target关键参数解析:
User=%i:%i是模板实例名(如vncserver@1.service中的1),确保服务以目标用户身份运行;PIDFile=...:精确指向 VNC 生成的 pid 文件,systemd依赖此文件判断进程状态;ExecStartPre=...:启动前先尝试杀死残留进程,避免Address already in use错误;ExecStart=... -localhost no:这是核心!强制 VNC 监听所有接口(0.0.0.0:5901),而非默认的127.0.0.1:5901,否则外部无法连接;Restart=always:进程退出即重启,RestartSec=10设定 10 秒后重启,避免高频崩溃;StartLimitInterval=0:禁用启动次数限制,确保服务永不“被禁用”。
4.2 启用并启动用户级服务
启用服务(使systemctl --user enable生效):
systemctl --user daemon-reload systemctl --user enable vncserver@1.service启动服务:
systemctl --user start vncserver@1.service检查状态:
systemctl --user status vncserver@1.service # 应显示:active (running)查看实时日志(比~/.vnc/*.log更结构化):
journalctl --user -u vncserver@1.service -f4.3 配置用户登录时自动启动 systemd user session
Ubuntu 16.04 的 LightDM 登录管理器默认不激活systemd --usersession,需手动配置。编辑/etc/lightdm/lightdm.conf:
sudo nano /etc/lightdm/lightdm.conf在[Seat:*]段落下添加:
[Seat:*] user-session=ubuntu session-wrapper=/etc/X11/Xsession然后创建/etc/X11/Xsession.d/99-systemd-user(数字前缀确保最后执行):
sudo nano /etc/X11/Xsession.d/99-systemd-user填入:
if [ -d "$HOME/.config/systemd/user" ]; then systemctl --user import-environment DISPLAY XAUTHORITY systemctl --user start default.target fi此脚本确保每次用户通过 LightDM 图形登录时,自动启动其systemd --user环境,并激活default.target(即所有WantedBy=default.target的服务)。
4.4 多用户并发部署:为不同用户分配独立 display number
一个服务器可同时为多个用户运行 VNC 服务,关键是 display number 不冲突。例如:
- 用户
alice使用:1→ 端口5901 - 用户
bob使用:2→ 端口5902 - 用户
charlie使用:3→ 端口5903
为bob配置:
# 切换到 bob 用户 sudo su - bob # 生成密码、创建 xstartup(内容同 alice,无需修改) vncpasswd nano ~/.vnc/xstartup # 确保内容一致 chmod +x ~/.vnc/xstartup # 启用并启动服务 systemctl --user daemon-reload systemctl --user enable vncserver@2.service systemctl --user start vncserver@2.service # 退出 exit在防火墙上放行对应端口:
sudo ufw allow 5902 sudo ufw allow 5903注意:display number 不能跳过
:0。:0是系统默认 X server(LightDM 登录界面)占用的,强行使用会导致图形登录界面崩溃。务必从:1开始。
4.5 性能调优:降低 CPU 占用与网络带宽消耗
TigerVNC 默认启用 JPEG 压缩,但在 Ubuntu 16.04 上,其 JPEG 库(libjpeg-turbo)版本较老,压缩效率不高。我们通过xstartup中的vncconfig工具进行精细控制:
在~/.vnc/xstartup文件末尾,exec gnome-session ...行之前,添加:
vncconfig -iconic &然后修改ExecStart命令,加入压缩参数:
ExecStart=/usr/bin/vncserver :%i -geometry 1366x768 -depth 24 -localhost no -compresslevel 9 -quality 85参数说明:
-compresslevel 9:启用最高级别 zlib 压缩(非 JPEG),对文本和 GUI 元素更高效;-quality 85:JPEG 压缩质量设为 85(100 为无损,但带宽激增),平衡清晰度与流量。
实测数据:在 10Mbps 网络下,-compresslevel 9 -quality 85相比默认设置,CPU 占用下降 35%,带宽消耗降低 42%,而桌面操作流畅度无感知差异。
4.6 安全加固:禁用明文认证与限制 IP 访问
VNC 协议本身不加密,密码和画面数据均以明文传输。在公网或不信任网络中,必须通过 SSH 隧道或 VPN 代理。但即使在内网,也应做基础加固:
禁用 VNC 内置密码(可选):若已使用 SSH 隧道,则可在
vncserver启动命令中添加-nopw参数,完全依赖 SSH 认证。限制连接 IP:利用
ufw实现源 IP 白名单。例如,只允许192.168.1.0/24网段访问:
sudo ufw delete allow 5901 sudo ufw allow from 192.168.1.0/24 to any port 5901- 禁用 VNC Viewer 的“保存密码”功能:在客户端设置中取消勾选
Save password,避免密码明文存储在 Windows 注册表或 macOS Keychain 中。
实操心得:我在某高校实验室部署时,为防止学生误操作,将
vncserver@.service的RestartSec从10改为60,并添加StartLimitBurst=3。这意味着如果服务在 1 分钟内连续崩溃 3 次,systemd将停止尝试启动,强制管理员介入检查。这比让服务无限重启、耗尽内存更符合教育场景的管理需求。
5. 常见问题与排查技巧实录:来自 12 个真实故障现场的速查手册
VNC 部署不是一蹴而就的线性过程,而是一系列“现象→日志→假设→验证→修复”的循环。以下是我在过去两年处理的 12 个典型故障案例,按发生频率排序,每个都附带精准定位方法和一键修复命令。这些不是教科书式的泛泛而谈,而是从服务器机房、客户办公室、实验室角落里亲手敲出来的经验。
5.1 故障速查表:症状、日志线索与根因定位
| 症状 | 关键日志线索(~/.vnc/*.log或journalctl) | 根本原因 | 一键修复命令 |
|---|---|---|---|
| 连接后黑屏,鼠标可见 | gnome-session[xxxx]: CRITICAL: Unable to connect to D-Bus | xstartup中未unset DBUS_SESSION_BUS_ADDRESS | sed -i '2i\unset DBUS_SESSION_BUS_ADDRESS' ~/.vnc/xstartup |
| 连接后显示灰色背景,无菜单栏 | metacity[xxxx]: WARNING: Failed to load theme "Ambiance" | GNOME Flashback 主题缺失 | sudo apt install gnome-themes-standard |
| 键盘输入无效,Ctrl+C/V 不工作 | Xvnc[xxxx]: warning: can't get client input focus | xstartup中XKL_XMODMAP_DISABLE=1缺失 | sed -i '3i\export XKL_XMODMAP_DISABLE=1' ~/.vnc/xstartup |
| VNC Viewer 提示 "Connection refused" | journalctl --user -u vncserver@1.service无输出 | systemd --user未激活,或服务未 enable | loginctl enable-linger $USER && systemctl --user daemon-reload |
| 启动服务时报 "Address already in use" | vncserver :1输出Error: Could not bind to address | 上次崩溃的Xvnc进程残留 | pkill -u $USER Xvnc && rm -f ~/.vnc/*.pid |
| 多用户中,用户 B 连接后用户 A 桌面消失 | lightdm[xxxx]: WARNING: Failed to get session | display number 冲突(如 B 也用了:1) | sudo ss -tulnp | grep :590查看端口占用,为 B 分配:2 |
桌面分辨率固定为 1024x768,无视-geometry | Xvnc[xxxx]: Initializing built-in font后无 geometry 日志 | xstartup中exec命令前有exit或return | head -n 5 ~/.vnc/xstartup检查首行是否为#!/bin/sh |
| VNC Viewer 连接后,本地 Ctrl+Alt+Del 被截获 | 无日志,但本地系统重启 | VNC Viewer 客户端设置中Send special keys未禁用 | 客户端菜单 → Options → Inputs → 取消勾选Send special keys |
5.2 深度排查:如何读懂Xvnc启动日志中的隐藏信息
~/.vnc/*.log文件是诊断核心,但其输出格式混乱,关键信息常被淹没。我编写了一个vnc-log-analyze.sh脚本,可一键提取有效线索:
#!/bin/bash # 保存为 ~/vnc-log-analyze.sh,chmod +x 后运行 LOG_FILE=$(ls -t ~/.vnc/*.log 2>/dev/null | head -n1) if [ -z "$LOG_FILE" ]; then echo "No VNC log found"; exit 1; fi echo "=== Analyzing latest log: $LOG_FILE ===" echo "1. Xvnc process PID:" grep "Xvnc.*started" "$LOG_FILE" | tail -n1 | awk '{print $NF}' echo "2. Last 5 errors:" grep -i "error\|fail\|warn\|critical" "$LOG_FILE" | tail -n5 echo "3. Desktop environment:" grep "exec.*gnome-session\|exec.*startxfce4" "$LOG_FILE" | tail -n1 echo "4. Port binding:" grep "Listening for VNC" "$LOG_FILE" | tail -n1运行~/vnc-log-analyze.sh,5 秒内即可获得上述表格中 80% 故障的定位结论。这是我给所有运维同事的标配工具。
5.3 “剪贴板不同步”的终极解决方案
网上流传的“安装 autocutsel”方案在 Ubuntu 16.04 上基本无效,因为autocutsel与 GNOME 的gnome-settings-daemon剪贴板守护进程冲突。真正可靠的方案是:在xstartup中启动xclipboard并强制同步。
修改~/.vnc/xstartup,在exec gnome-session ...行之前添加:
xclipboard -nolisten tcp & sleep 1 xterm -e "sh -c 'while true; do xclip -o -selection clipboard \| xclip -i -selection primary; sleep 1; done'" &这段代码启动一个后台循环,每秒将clipboard(Ctrl+C/V)内容同步到primary(鼠标中键粘贴)缓冲区,完美解决 VNC Viewer 中鼠标中键无法粘贴的问题。实测在 100M 内网中,同步延迟低于 200ms。
5.4 “无法启动 GNOME Flashback”的应急回退方案
若因软件包损坏导致gnome-session --session=gnome-flashback-metacity启动失败,可立即切换到xfce4作为临时桌面(无需重装系统):
sudo apt install xfce4 xfce4-goodies然后修改~/.vnc/xstartup,将最后一行替换为:
exec /etc/X11/Xsession /usr/bin/xfce4-sessionxfce4在 Ubuntu 16.04 上兼容性极佳,启动速度快,资源占用低,是黄金备用方案。我曾在某制造企业现场,因客户私自升级了glib2.0导致 GNOME Flashback 崩溃,用此方案 3 分钟内恢复远程访问,避免了产线停机。
5.5 防火墙与端口冲突的自动化检测脚本
端口被占用是连接失败的首要原因。手动netstat效率低下,我编写了vnc-port-check.sh:
#!/bin/bash PORTS=(5901 5902 5903) for PORT in "${PORTS[@]}"; do if sudo lsof -i :$PORT 2>/dev/null | grep LISTEN; then echo "PORT $PORT is occupied:" sudo lsof -i :$PORT | grep LISTEN echo "Kill with: sudo kill -9 \$(sudo lsof -t -i :$PORT)" else echo "PORT $PORT is free" fi done将其加入~/.bashrc的 alias:
alias vnccheck='~/vnc-port-check.sh'运维时只需输入vnccheck,所有 VNC 端口状态一目了然。
最后分享一个小技巧:Ubuntu 16.04 的
vncserver启动时,会在~/.vnc/下生成passwd、xstartup、*.log和*.pid四类文件。我习惯将整个~/.vnc/目录用tar czf vnc-backup-$(date +%Y%m%d).tar.gz ~/.vnc/打包备份。当遇到无法修复的配置错误时,删除~/.vnc/后解压备份,5 秒还原到上一个稳定状态。这比重装 TigerVNC 或重配xstartup快得多,是我个人的“后悔药”。