Linux 中哪个进程以 Systemd 作为 INIT 启动 X Server?

Linux 中哪个进程以 Systemd 作为 INIT 启动 X Server?

我正在运行Linux系统的设备,但是,在Xserver启动之前需要手动配置显示设备,否则帧缓冲设备将无法工作。

有2种方法可以实现这种“手动操作”:

  1. 在 xinit 之前运行此操作,但是,在谷歌搜索并阅读 startx 脚本之后,我发现在 xinit 运行之前没有运行脚本钩子;

  2. 在Xserver启动之前实现一个systemd单元来执行此“手动操作”,我搜索但找不到可以告诉我实际运行“startx”或启动Xserver的服务或进程的信息;

所以我把这个问题发在这里,希望有人能给我提示。

答案1

通过运行命令ps -A | grep Xorg | awk '{print $1}' | xargs pstree -s -p 我发现这Xorg是一个子进程sddm

以下是我的 Fedora 36 中该命令的结果:

systemd(1)───sddm(1642)───Xorg(1645)─┬─{Xorg}(1647)
                                                                    ├─{Xorg}(1648)
                                                                    ├─{Xorg}(1649)
                                                                    ├─{Xorg}(1650)
                                                                    ├─{Xorg}(1651)
                                                                    ├─{Xorg}(1652)
                                                                    ├─{Xorg}(1653)
                                                                    ├─{Xorg}(1654)
                                                                    └─{Xorg}(1658)

SDDM阅读了源代码后,我终于知道了Xorg是如何在systemd init过程中启动的。

在 systemd 中graphical.targetdisplay-manager.service被称为。

例如,我使用sddm.serviceas display-manager.service,它本身会在显示登录屏幕之前sddm启动。Xorg

这取决于哪个显示管理器用户用来运行脚本。 运行后sddm提供/etc/sddm/Xsetup脚本,但是启动前不提供任何脚本钩子。XorgsddmXorg

如果您在 systemd init 过程中不使用任何脚本display-manager.service,则可以使用startxbing up Xorg,并且可以在副xserverrc文件中添加自己的脚本。

在这种情况下,如果你想在Xorg真正启动之前运行一个特殊的命令,最好的方法是编写一个systemd unitwhich running Before=display-manager.service,这将确保该命令在Xorg启动之前运行。

我将研究gdm源代码以查找是否gdm提供任何预启动 Xorg 脚本挂钩。

答案2

有人说你永远可以(如果没有被邀请)摆弄你自己的startx脚本以便在调用 xinit 之前启动任何命令,
如果您的独特需求是在 X 服务器之前启动命令,那么您可以注意到(通过未修改的 startx)X 服务器将由脚本执行/etc/X11/xinit/xserverrc

因此,只需在执行之前在此脚本中插入命令即可。

当然,如果您的命令在成功或失败时返回任何值,那么明智的做法是在继续之前对其进行测试......

相关内容