systemd:在 AccountsService 加载之前运行自定义脚本

systemd:在 AccountsService 加载之前运行自定义脚本

我开始了一个小项目。我想在 GDM(登录屏幕)中选择不同的默认桌面环境,具体取决于我是在虚拟机管理程序上运行还是在裸机上运行。我已经创建了一个脚本,它具有检测其运行方式的基本逻辑,然后适当地更改默认条目。我关心的是启动时自动运行此脚本,它将XSessionin的值交换/var/lib/AccountsService/users/jeremygnomegnome-classic(请参阅了解更多信息)。我对此有几个问题:

  • 我应该如何正确创建文件.service以确保我的脚本(位于/opt/DetectENV/switcher.sh)在启动期间加载之前执行AccountsService?(如果有帮助的话,我正在使用 Fedora 30 Workstation)

  • 将此文件放在哪里最好.service?不确定应该是/etc/systemd/system/还是/etc/systemd/user

答案1

使用 [Unit] 中的选项Before=accounts-daemon.service。这将与 accounts-daemon 具有 After= 的方式相同你的服务:如果两个单元都排队,那么它的启动将被延迟,直到您的服务完成初始化。

(这也意味着你的服务必须使用正确的类型,即通常为Type=oneshot,以便让 systemd 知道其初始化何时完成。在这种情况下,因为你想运行一个简单的命令并等到该命令完成退出,Type=oneshot 是正确的选择。)

请注意,您的服务必须已配置为以正常方式在启动时启动(即通过 WantedBy= 和systemctl enable)。Before/After= 选项不声明依赖关系;它们除了通知 systemd 正确的顺序外,不会执行任何其他操作。

所有特权服务都是系统服务。只有在需要启动“用户”服务时,才需要创建该服务登录后并绑定到您的用户帐户。(例如,Dropbox 或 gnome-settings-daemon 可以是“用户”服务。)

(此外,由于“系统”和“用户”服务由完全独立的systemd,排序和依赖关系仅在同一实例内的单元之间起作用。也就是说,系统单元只能引用其他“系统”单元;用户单元只能依赖于其他“用户”单元。)

相关内容