![动态启动日志背景](https://linux22.com/image/1570967/%E5%8A%A8%E6%80%81%E5%90%AF%E5%8A%A8%E6%97%A5%E5%BF%97%E8%83%8C%E6%99%AF.png)
在启动过程中,我在 TTY 上看到了常见的消息。此后,当 X 启动时,xfce 和 xfdesktop 将设置纯色作为背景。
我不使用背景,我的桌面上没有图标。如果启动消息在 X 启动后仍保留在那里,那看起来会很酷。有办法实现吗?
答案1
我将提供两种生成近似于启动消息作为桌面背景的方法,一种是动态的,另一种是静态的。
这两种方法都需要安装 systemd 并通过 读取系统日志。可以通过 systemd-journal 组成员身份提供journalctl
运行的最低权限,例如,然后注销并登录。journalctl
usermod -aG systemd-journal YOUR_USERNAME
动态启动日志背景
基本思想是在最底层窗口层运行未修饰的终端来显示日志内容。对于像 fluxbox 这样的简单窗口管理器,可以通过将粘性最大化终端的堆叠顺序设置为“桌面”并运行来实现journalctl ...
,也可以选择通过窗口管理器的启动挂钩自动执行配置。
另一方面,在 Xfce 中最大化窗口会使 Dock 后面的桌面垂直区域未被覆盖,因此用户需要手动确定覆盖整个屏幕所需的终端几何形状,这主要由字体设置和屏幕分辨率决定。获得近似值的一个好方法是运行
xfce4-terminal --fullscreen --hide-menubar --hide-borders --hide-toolbar --hide-scrollbar
并检查终端的决定:
$ echo $COLUMNS
102
$ echo $LINES
40 # maybe subtract one to compensate for the height of the taskbar
以下辅助脚本(不用于手动运行(参见xfce4-terminal ...
下面的命令))将用于将标题为“journalterm”的终端设置为粘性终端,从任务栏和应用程序切换器中省略,位于其他窗口下方,然后执行journalctl ...
:
#!/bin/bash
xdotool search --name journalterm; # wmctrl focus bug?
for i in below skip_{pager,taskbar} sticky; do
wmctrl -v -r journalterm -b add,$i; # comment out -v for quiet
done
tput civis; # hide the terminal cursor
[JOURNALCTL_CMD]
应该[JOURNALCTL_CMD]
替换为
exec journalctl --lines=all --follow
或者
journalctl --lines=all --follow --no-hostname -oshort-unix \
|stdbuf -i0 -oL -eL cut -d\ -f1 --complement \
|grep --line-buffered -F 'systemd[1]' \
|sed -uE "s/systemd\[1\]:/\[ `printf '\033[00;32m'`OK`printf '\033[00m'` \]/g"
前者journalctl ...
只是输出系统日志
而后者将在系统启动的最后阶段模拟 systemd 输出,并且可能会为了简单起见跳过实际启动过程中显示的一些消息。
stdbuf
从 中删除缓冲cut
,而grep
和sed
具有自己的本机参数,用于强制将 systemd 的新输出在准备就绪后立即显示到终端。
然后,运行上述脚本的命令应如下所示,其中[C]
和[L]
分别替换为之前计算出的列数和行数:
xfce4-terminal -T journalterm --geometry=[C]x[L] --hide-menubar --hide-borders --hide-toolbar --hide-scrollbar --execute /path/to/the/above/script
这可以在登录时通过在会话和启动>应用程序自动启动中添加执行上述行的条目来自动启动。
静态启动日志背景
以下脚本将生成 systemd 最新消息的 PNG:
#!/bin/bash
exec xfce4-terminal --fullscreen --hide-menubar --hide-scrollbar --execute \
bash -c \
"tput civis; PS1=; \
journalctl --no-hostname -oshort-unix \
|cut -d\ -f1 --complement \
|grep -F 'systemd[1]' \
|sed -E \"s/systemd\[1\]:/\[ `printf '\033[00;32m'`OK`printf '\033[00m'` \]/g\" \
|head -c-1; \
read -t1; import -window root systemd-`date +%s`.png";
请注意,PNG 是通过截取全屏终端的屏幕截图生成的,因此不建议在此过程中与系统交互,但read ..
在更快的系统上可以降低由此引起的延迟以减少等待时间。与上述xfce4-terminal ...
命令一样,如果需要,此脚本可以由 Xfce 自动运行,以在每次登录时生成 systemd 消息的全新静态图像。Xfce 会注意到提供桌面背景的文件是否已更改并相应地更新壁纸,因此根据import
用例调整每次写入同一文件可能会很有用。
上述脚本只需要一个知道如何全屏并运行脚本的终端。例如,exec xfce4-terminal ...
可以将该行替换为xterm -fullscreen -e \
,脚本仍将按预期运行。
答案2
以下命令每 5 秒用虚拟终端文本内容的图像更新根窗口上的图像:
$ sudo watch -n 5 myscript.sh
其中 myscript.sh 是:
#! /bin/bash
# Dump vt1 console to a file
setterm -dump 1 --file ~/screen.dump
# Get the screen resolution, e.g. 1920x1080 (there may be an easier way, but...)
RESOLUTION=xdpyinfo | grep dimensions | cut -d : -f 2 | cut -d p -f 1 | tr -d [:space:]
# Convert the text file to a png image
convert -size $RESOLUTION xc:black -font "FreeMono" -pointsize 12 -fill white -annotate +15+15 "@screen.dump" ~/screen.png
# Send it to the root window
xli -onroot -quiet -fillscreen ~/screen.png
答案3
一个解决方案是构建一个虚拟机,然后在该虚拟机启动时截取屏幕截图。将该屏幕截图作为背景图像。