VNC启动报错A VNC server is already running as :10

本文记录了一次VNC服务启动失败的问题排查过程及解决方案。主要问题是由于sshd占用6010端口导致VNC服务无法启动,通过调整sshd_config中X11DisplayOffset设置解决了端口冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VNC启动报错A VNC server is already running as :10

  • 问题描述:

开启vncserver session10
systemctl start vncserver@:10.service

systemctl start vncserver@:10.service

查看vnc 监听状态
netstat -antp | grep 59

netstat -antp | grep 59

session10连接未建立

查看session10状态
systemctl status vncserver@:10.service

systemctl status vncserver@:10.service

● vncserver@:10.service - Remote desktop service (VNC)
Loaded: loaded (/etc/systemd/system/vncserver@:10.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Mon 2022-11-21 18:14:23 CST; 8s ago
Process: 245741 ExecStart=/usr/bin/vncserver_wrapper user010 %i (code=exited, status=2)
Process: 245733 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
Main PID: 245741 (code=exited, status=2)

Nov 21 18:14:23 nj01 systemd[1]: Starting Remote desktop service (VNC)…
Nov 21 18:14:23 nj01 systemd[1]: Started Remote desktop service (VNC).
Nov 21 18:14:23 nj01 vncserver_wrapper[245741]: A VNC server is already running as :10
Nov 21 18:14:23 nj01 vncserver_wrapper[245741]: FATAL: ‘runuser -l user010’ failed!
Nov 21 18:14:23 nj01 systemd[1]: vncserver@:10.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Nov 21 18:14:23 nj01 systemd[1]: Unit vncserver@:10.service entered failed state.
Nov 21 18:14:23 nj01 systemd[1]: vncserver@:10.service failed.

参照网络教程,使用/usr/sbin/lsof -i tcp:5910查看端口占用,无输出

/usr/sbin/lsof -i tcp:5910

找不到进程当然无法kill,使用vncserver -kill :5910也是无效的

  • 问题排查:

vnc的缺省端口是main:5900(C/S)和http:5800(B/S)端口
检查5910端口和5810,无输出
netstat -an | grep 5910
netstat -an | grep 5810

查看vnc端口说明:Linux下的VNC可以同时启动多个vncserver,各个vncserver之间用显示编号(display number)来区分,每个vncserver服务监听3个端口,它们分别是:
5800+显示编号: VNC的httpd监听端口,如果VNC客户端为IE,Firefox等非vncviewer时必须开放。 5900+显示编号: VNC服务端与客户端通信的真正端口,必须无条件开放。
6000+显示编号: X监听端口,可选。

查看6010端口占用情况

/usr/sbin/lsof -i tcp:6010

[root@nj01]$ /usr/sbin/lsof -i tcp:6010
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 19464 root 8u IPv4 143749109 TCP localhost.localdomain:x11-ssh-offset (LISTEN)

确认是sshd占用了6010端口
kill进程后重新开启vnc服务,成功

使用X11 forwording进行图像映射时,在client端(目标机器,即ssh连接的机器)会根据sshd_config中的配置X11DisplayOffset启动对应端口进行转发,配置默认值是10,即启动6010端口进行转发。该端口有时会和Xserver启动的端口冲突,导致Xserver无法启动。
可以通过修改X11DisplayOffset配置来避免冲突。

vim /etc/ssh/sshd_config
X11DisplayOffset 50
<think>嗯,用户之前已经询问过关于vncserver@1.service的配置问题,现在他们的服务启动失败了,显示Active: failed,错误信息里提到已经有VNC服务器在运行了。我需要先看看用户提供的日志内容。 首先,用户提供的日志显示进程4092执行失败,状态码1,错误信息是“A VNC/X11 server is already running as :1”,这说明端口被占用了。可能用户之前启动过服务但没正确停止,或者ExecStartPre的清理命令没起作用。 之前我建议他们修改服务文件,把User从root改为普通用户tom,并且调整PIDFile路径。但可能用户还没应用这些修改,或者修改后依然存在问题。另外,在之前的建议里,我提到过ExecStartPre可能无法彻底终止旧进程,这里的问题可能就是残留进程导致的。 用户现在遇到的问题是服务启动失败,所以需要一步步排查。首先应该检查是否有残留的VNC进程,使用ps aux | grep vnc或者直接检查端口5901是否被占用。然后确认PIDFile的路径是否正确,因为如果PID文件路径不对,systemd可能无法正确识别旧进程,导致清理失败。 另外,用户可能还在使用root用户运行服务,导致权限问题或者PID文件位置不正确。需要确保服务文件中User和Group设置为普通用户,并且对应的目录权限正确。比如,/home/tom/.vnc目录的所属和权限是否设置正确,还有密码文件的权限是否为600。 另外,服务类型Type=simple可能有问题,之前建议改为forking,但用户可能没有修改,或者TigerVNC的行为导致systemd误判进程状态。如果服务类型不正确,systemd可能认为主进程已经退出,从而标记服务为失败。 还有SELinux可能阻止了VNC服务的启动,需要检查SELinux的状态,如果是enforcing模式,可能需要调整策略或者添加相应的规则。 用户可能按照之前的步骤修改了服务文件,但仍有遗漏,比如没有执行daemon-reload或者restart服务,导致旧的配置仍在运行。或者修改后的配置有语法错误,导致服务无法正确加载。 需要建议用户按照之前的优化建议彻底修改服务文件,然后执行systemctl daemon-reload和restart服务,再检查状态。如果还有问题,查看journalctl的日志,获取更详细的错误信息。 可能还需要手动终止残留的VNC进程,比如使用vncserver -kill :1或者直接kill进程,然后再启动服务。同时,检查防火墙设置,确保端口5901是开放的,没有其他服务占用该端口。 总结下来,用户的问题主要是因为残留进程导致服务启动失败,需要确保清理干净,调整服务配置中的用户和PID路径,正确设置权限,并处理可能的SELinux问题。接下来需要一步步引导用户进行排查,确保每个步骤都正确执行,避免遗漏。</think>根据你提供的 `vncserver@1.service` 错误日志,以下是关键问题分析和解决方案: --- ### **一、错误原因定位** #### **1. 核心报错信息** ```plaintext A VNC/X11 server is already running as :1 on machine xinzhu-Not-Specified ``` - **直接原因** VNC 服务端口 `:1`(对应 TCP 端口 `5901`)已被占用,导致新服务启动失败。 #### **2. 根本问题分析** - **残留进程未清理** `ExecStartPre` 中的 `vncserver -kill :%i` 未彻底终止旧进程。 - **PIDFile 路径不匹配** PID 文件路径 `/home/tom/.vnc/%H:%i.pid` 与实际生成的 PID 文件路径不一致,systemd 无法识别旧进程。 --- ### **二、紧急解决方案** #### **1. 手动清理残留进程** ```bash # 强制终止所有 VNC 相关进程 sudo pkill -9 Xvnc sudo pkill -9 vncserver # 确认端口释放 ss -tuln | grep 5901 ``` #### **2. 修正服务配置** 修改 `/etc/systemd/system/vncserver@1.service`: ```ini [Service] ... # 确保 PIDFile 路径与实际一致(示例中用户为 tom) PIDFile=/home/tom/.vnc/xinzhu-Not-Specified:1.pid # 根据实际主机名调整 ... ``` --- ### **三、彻底优化步骤** #### **1. 避免 PIDFile 路径问题** - **方案一:简化 PIDFile 命名** ```ini PIDFile=/home/tom/.vnc/%i.pid # 仅用显示编号(如 1.pid) ``` - 需在 `ExecStart` 命令中显式指定 PID 文件路径: ```bash ExecStart=/usr/bin/vncserver -fg -localhost no -geometry 1920x1080 -depth 24 -rfbport 590%i -rfbauth /home/tom/.vnc/passwd -Log /home/tom/.vnc/%i.log :%i ``` - **方案二:动态获取主机名** 使用脚本生成 PIDFile 路径: ```ini PIDFile=/home/tom/.vnc/$(hostname -s):%i.pid ``` #### **2. 增强服务可靠性** ```ini [Service] ... # 添加重试机制和超时控制 Restart=on-failure RestartSec=5s TimeoutStartSec=30 ... ``` --- ### **四、操作验证流程** 1. **应用新配置** ```bash sudo systemctl daemon-reload sudo systemctl restart vncserver@1.service ``` 2. **检查服务状态** ```bash systemctl status vncserver@1.service ``` 3. **查看详细日志** ```bash journalctl -u vncserver@1.service -n 50 --no-pager ``` --- ### **五、常见问题扩展** #### **1. 防火墙/端口冲突** - 确认防火墙允许端口 `5901`: ```bash sudo ufw allow 5901 ``` - 检查其他服务是否占用 `5901`: ```bash sudo lsof -i :5901 ``` #### **2. 用户权限问题** - 确保用户 `tom` 对相关文件有权限: ```bash chown -R tom:tom /home/tom/.vnc chmod 600 /home/tom/.vnc/passwd ``` #### **3. SELinux 拦截** - 临时放行测试: ```bash sudo setenforce 0 ``` - 永久添加规则(如需): ```bash sudo semanage port -a -t vnc_port_t -p tcp 5901 ``` --- ### **六、最终配置参考** ```ini [Unit] Description=Start TigerVNC server for display :%i After=syslog.target network.target [Service] Type=forking User=tom Group=tom WorkingDirectory=/home/tom PIDFile=/home/tom/.vnc/%i.pid ExecStartPre=/usr/bin/vncserver -kill :%i > /dev/null 2>&1 ExecStart=/usr/bin/vncserver -fg -localhost no -geometry 1920x1080 -depth 24 -rfbport 590%i -rfbauth /home/tom/.vnc/passwd :%i ExecStopPost=/usr/bin/vncserver -kill :%i > /dev/null 2>&1 Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target ``` 修改后执行 `systemctl daemon-reload && systemctl restart vncserver@1.service`,若仍有问题,请提供最新日志。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值