如何将 display-manager.service 的启动延迟到我的 systemd 单元的脚本退出之后?

如何将 display-manager.service 的启动延迟到我的 systemd 单元的脚本退出之后?

我正在为 Ubuntu 18+ 编写一个云同步脚本,确保在启动过程中从远程提取一些关键文件。我希望它在普利茅斯启动屏幕之后、用户登录屏幕之前运行(无论有或没有图形环境)。

对于此应用程序来说,延迟登录直到脚本退出是必要的,因为我需要将消息打印到控制台并等待用户按键确认,然后才能登录;但我似乎无法正确获取 systemd 服务单元。

下面的示例适用于非图形环境 (systemd default.target = multi-user.target),但不适用于图形环境 (default.target =graphical.target)。我缺少什么?

[Unit]
Requires=network-online.target
After=network-online.target plymouth-quit-wait.service
[email protected]

[Service]
Type=oneshot
StandardInput=tty
StandardOutput=tty
StandardError=tty
TTYPath=/dev/tty1
ExecStart=/home/user/myscript.sh

[Install]
WantedBy=multi-user.target

答案1

正确的顺序似乎是在之后plymouth-quit.service,但在之前display-manager.service,这是之前启动的最后一个单元plymouth-quit-wait.service。即,如果启用,则启动显示管理器启动画面消失。

因此,要在不添加覆盖显示管理器服务的情况下克服普利茅斯问题,解决方法是在脚本中运行新服务tty2并将虚拟终端切换到。tty2

[Unit]
Requires=network-online.target
After=network-online.target plymouth-quit.service
Before=display-manager.service

[Service]
Type=oneshot
StandardInput=tty
StandardOutput=tty
StandardError=tty
TTYPath=/dev/tty2
TTYReset=yes
TTYVHangup=yes
ExecStart=/path/to/script.sh

[Install]
WantedBy=multi-user.target
#!/bin/bash

# Change the virtual terminal to tty2
# so user can interact with the script and see its output
chvt 2

# do stuff
echo "Hello, world!"

# Change back to tty1
# so user is shown console login,
# or sent to wherever the display manager decides
chvt 1

这是可行的,但如果不向脚本添加额外的逻辑或编写包装器,它就不是很干净。tty1例如,如果我在 以外的任何地方运行它(例如在 上运行的桌面tty7),或者tty2已经被占用。

这应该没问题,因为我的脚本应该只在启动时运行,但如果有一个纯粹的 systemd 解决方案可以让我在或的tty1整个时间内保持所有内容,我很想听听它。default.targetmulti-users.targetgraphical.target

相关内容