答案1
当 systemd 打印其输出时,它会根据当前屏幕分辨率调整行。
当 lightdm 关闭时,屏幕分辨率将恢复为默认值。 systemd 已经打印了前面的行,因此它不会向后并尝试清除屏幕,然后在每次分辨率更改时以新分辨率重新打印内容,这是有道理的。
为了解决这个问题,你可以弄清楚,你需要设置默认 TTY 分辨率以匹配您的 X(或 wayland)服务器的分辨率。
我还要指出,花精力改善关闭文本的外观是相当迂腐的。这些消息不会在屏幕上显示太长时间,如果服务关闭挂起,它将以您当前的分辨率打印,这意味着任何重要的内容都应该可读。如果您的日志是持久的(存储在启动之间/var/
并且在启动之间不会被删除),那么您会放心地知道日志的存储方式与显示时的方式不同。如果您已将日志配置为持久性,则可以journalctl -b 1
查看上次启动时正确对齐的消息。如果您认为有必要阅读这些消息并认为它们不可读,那么这对您可能很重要。
答案2
免责声明:该解决方案适用于运行 systemd 和 LightDM 的用户。如果您的设置不同,您可能需要修改以下说明以适合您的系统。如果您不想阅读有关未对齐的关闭消息的所有背景信息,请跳至解决方案部分。
概述:我花了很长时间试图解决这个问题,直到几天前才解决。它很可能与您的屏幕分辨率无关,而是由您的应用程序之一(可能是 LightDM)错误地格式化您的终端/tty 引起的。在启动/关闭期间的某个时刻,某些内容会更改您的 tty,以便新行 (NL) 不会像通常那样收到自动回车符 (CR)。在英语中,这意味着如果您按下Enter键盘,文本光标将向下移动一行,但不会将其自身重新对齐到终端窗口的左侧(您可以在您提供的图片中看到这一点,https://i.stack.imgur.com/oARSo.jpg)。这被称为“阶梯效应”,据我所知,这是 Linux 上相当常见的问题。解决上述问题的核心代码是stty opost onlcr
,但如果您不知道到底将其放在 systemd 中的何处,那么使用它可能会很痛苦。如果太早或太晚应用该命令,您将只是格式化已经正确显示的文本。一种解决方案是创建一个自定义系统服务来正确调整 tty 输出。您可以偶尔让服务自行重新启动,这样您就不必确定stty opost onlcr
应该去的确切位置。
解决方案:
#找出您的桌面环境(例如 Gnome、KDE Plasma 等)正在运行的 tty 实例。通常它是 tty1,但由于您使用的是 LightDM,所以它实际上应该是 tty7。在步骤 2 中创建 systemd 服务时,您需要此信息。
- 在您的终端中运行
who
。它应该产生如下输出:
用户名 tty7 2021-02-08 12:11 (:0)
#以 root 身份在/etc/systemd/system/
.在该ExecStart=
部分下,包含您在步骤 1 中找到的 tty 信息。将服务命名为您想要的任何名称,例如staircase-effect.service
。
- 在您的终端中运行
sudo nano /etc/systemd/system/staircase-effect.service
。这是一个可以尝试的示例单元,后面会解释重要的选项。
[Unit]
Description=修复 tty 楼梯效果
DefaultDependencies=no
Before=halt.target shutdown.target restart.target
[电子邮件受保护]
StartLimitBurst=5
StartLimitIntervalSec=0[服务]
Type=simple
ExecStart=/bin/stty -F /dev/tty7 opost onlcr
Restart=always
RestartSec=30[安装]
WantedBy=多用户.target
StartLimitIntervalSec=0
- 将此选项设置为“0”可以让 systemd 无限次重新启动您的服务而不返回任何错误。
Type=simple
- 对于此服务,最好使用“简单”而不是“一次性”,因为它在永无休止的循环中运行。 AFAIK,“oneshot”会阻止其他服务同时运行,在这种情况下这是不希望的。
ExecStart=/bin/stty -F /dev/tty7 opost onlcr
- 这条线实际上解决了楼梯消息。确保输入从who
步骤 1 中的命令获得的正确 tty 号码。
Restart=always
- 您希望此服务重复出现,除非您确切知道将其放置在启动/关闭过程中的位置。stty
如果在文本已正确显示的情况下运行该命令,则该命令是无效的。
RestartSec=30
- 从技术上讲,此选项取决于个人喜好。您将希望您的服务足够频繁地自行重新启动以解决问题,但又不能太频繁,以免问题本身变得麻烦。
#以 root 身份启用您的新服务systemctl
。
- 在您的终端中运行
sudo systemctl enable staircase-effect.service
。然后reboot
看看修复是否有效。
可选的 LIGHTDM 调整:
#默认的LightDM服务/usr/lib/systemd/system/lightdm.service
与[email protected]
不必要的冲突(https://bugs.archlinux.org/task/49527?opened=22169&status%5B0%5D=)。我不确定这是否与楼梯消息有关,但从[email protected]
单元文件中删除该行可能不会有什么坏处。
- 在您的终端中运行
sudo systemctl edit --full lightdm.service
。然后删除或注释掉该[email protected]
行以阻止 LightDM 干扰您的标准 getty 服务。reboot
看看变化。
替代解决方案:
https://www.reddit.com/r/linux/comments/iwnm9w/shutdown_staircase_output_fix/
替代解决方案 1(这是我获得主stty
命令的地方)
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=617249
替代解决方案 2(适用于运行 System V 和 Debian 的用户)