更新:
我已经解决了这个问题。我在这里分享一下我的经验:
- 新的 vncsession 将分叉并检查子进程的状态
- 孩子检查
/home/$USER/.vnc/
。实际上主要问题是这个文件夹。看来这个文件夹是之前创建的,SELinux 上下文与 vncsession 不同。删除该文件夹并重新创建密码。 - 按照以下命令编译 TigerVNC转速规格,记住 RPM 版本使用前缀
/usr
,而 git 版本使用/usr/local
. - 将全部替换
perror
为syslog(LOG_CRIT, ...
以真正捕获错误消息。
主要问题是分叉进程的错误没有反映在journalct -t vncsession
或journalctl -u vncserver@:$DISPLAY
。您需要修改vncsession的源代码来找出根本原因。
原问题:
我正在 Fedora 33 上使用 TigerVNC。TigerVNC 的最新更新从 切换vncserver
到vncsession
。 Systemd 单元文件已更新以反映最新更改。但是,我无法使用最新的 systemd 单元文件启动 VNC,并且我正在调试它。服务运行正常(我添加-x
到包装器 bash 代码以查看 vncsession 是否被正确调用),然后服务启动不活跃的。
单元文件的基本结构为:
Type=forking
ExecStart=/.../vncsession-start DISPLAY
vncsession-start 实际上是一个包装器:
...
exec /.../vncsession USER DISPLAY
问题是当我systemctl start
服务时,它结束时没有错误(仅列出主 PID 且 ExitCode=0)。但我以另外两种方式运行它:
- 直接从 bash 运行:它运行,Xvnc 启动
- 将单元文件修改为
ExecStart=/bin/bash -cx 'strace -f vncsession USER DISPLAY'
并更改Type=simple
:Xvnc 也启动
第一次尝试是排除错误的vnc配置;第二个是检查 SELinux 设置。
根据文档,处理系统调用Type=forking
。fork()
我vncsession
用 strace 检查了,我看到的是:
- bash
exec
vnc会话 - vnc会话调用
clone()
,不是fork()
- vncsession 然后调用
execev()
启动 Xvnc
所以我的问题是:1)适合Type=
这种情况的是什么,是forking
正确的选择吗? 2)如何调试此类问题?
谢谢你!