![systemd:在 AccountsService 加载之前运行自定义脚本](https://linux22.com/image/1594293/systemd%EF%BC%9A%E5%9C%A8%20AccountsService%20%E5%8A%A0%E8%BD%BD%E4%B9%8B%E5%89%8D%E8%BF%90%E8%A1%8C%E8%87%AA%E5%AE%9A%E4%B9%89%E8%84%9A%E6%9C%AC.png)
我开始了一个小项目。我想在 GDM(登录屏幕)中选择不同的默认桌面环境,具体取决于我是在虚拟机管理程序上运行还是在裸机上运行。我已经创建了一个脚本,它具有检测其运行方式的基本逻辑,然后适当地更改默认条目。我关心的是启动时自动运行此脚本,它将XSession
in的值交换/var/lib/AccountsService/users/jeremy
为gnome
或gnome-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,排序和依赖关系仅在同一实例内的单元之间起作用。也就是说,系统单元只能引用其他“系统”单元;用户单元只能依赖于其他“用户”单元。)