Systemd Type=forking 不捕获子进程(已更新,不是由 systemd 引起的)

Systemd Type=forking 不捕获子进程(已更新,不是由 systemd 引起的)

更新:

我已经解决了这个问题。我在这里分享一下我的经验:

  • 新的 vncsession 将分叉并检查子进程的状态
  • 孩子检查/home/$USER/.vnc/。实际上主要问题是这个文件夹。看来这个文件夹是之前创建的,SELinux 上下文与 vncsession 不同。删除该文件夹并重新创建密码。
  • 按照以下命令编译 TigerVNC转速规格,记住 RPM 版本使用前缀/usr,而 git 版本使用/usr/local.
  • 将全部替换perrorsyslog(LOG_CRIT, ...以真正捕获错误消息。

主要问题是分叉进程的错误没有反映在journalct -t vncsessionjournalctl -u vncserver@:$DISPLAY。您需要修改vncsession的源代码来找出根本原因。

原问题:

我正在 Fedora 33 上使用 TigerVNC。TigerVNC 的最新更新从 切换vncservervncsession。 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=forkingfork()vncsession用 strace 检查了,我看到的是:

  • bash execvnc会话
  • vnc会话调用clone()不是 fork()
  • vncsession 然后调用execev()启动 Xvnc

所以我的问题是:1)适合Type=这种情况的是什么,是forking正确的选择吗? 2)如何调试此类问题?

谢谢你!

相关内容