我正在为 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.target
multi-users.target
graphical.target