动态启动日志背景

动态启动日志背景

在启动过程中,我在 TTY 上看到了常见的消息。此后,当 X 启动时,xfce 和 xfdesktop 将设置纯色作为背景。

我不使用背景,我的桌面上没有图标。如果启动消息在 X 启动后仍保留在那里,那看起来会很酷。有办法实现吗?

答案1

我将提供两种生成近似于启动消息作为桌面背景的方法,一种是动态的,另一种是静态的。

这两种方法都需要安装 systemd 并通过 读取系统日志。可以通过 systemd-journal 组成员身份提供journalctl运行的最低权限,例如,然后注销并登录。journalctlusermod -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 输出,并且可能会为了简单起见跳过实际启动过程中显示的一些消息。

systemd 输出作为背景

stdbuf从 中删除缓冲cut,而grepsed具有自己的本机参数,用于强制将 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 输出背景

以下脚本将生成 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

一个解决方案是构建一个虚拟机,然后在该虚拟机启动时截取屏幕截图。将该屏幕截图作为背景图像。

相关内容