ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

全局热键一键唤出/隐藏xterm:Linux终端高效切换实战

全局热键一键唤出/隐藏xterm:Linux终端高效切换实战

如果你和我一样,桌面永远堆着一排窗口,浏览器、编辑器、聊天工具各自占着一块屏幕,那么你一定经历过这种事:正写到一半想跑个命令,却发现唯一能用的 xterm 早被挤到不知道哪一层去了。鼠标移到任务栏翻来翻去找窗口,找到之后点一下,它又未必乖乖跑到前台。这时候我就特别想要一个“终端召唤术”——按下某个键盘组合键,xterm 该出来就出来,该藏起来就藏起来。这篇文章记录的,就是我折腾“键盘组合键监听 + xterm 唤醒程序”的完整过程,包括方案选型、代码实现、踩坑记录,以及最后沉淀下来的排查清单。

如果你平时工作流离不开命令行,经常需要在各种应用之间切来切去,或者你用的是轻量级桌面环境、老机器,那么这套思路可以直接照搬。我不光会给你能跑的脚本和配置,还会把每个关键选择背后的原因讲清楚,这样你以后想换个终端、换个按键、甚至扩展到其它程序,都能自己改。

1. 为什么需要一个“随时可唤出的 xterm”

1.1 触发场景与痛点:终端窗口被淹没

先说最典型的场景。我在编辑器里写着代码,突然想看某个函数的行为,或者想临时开个本地服务验证接口,这时候最顺手的动作是敲命令。但终端窗口在哪?它在桌面底部、被 IDE 和十几个标签页遮住了。我只好放下键盘,摸到鼠标,在任务栏里一个一个找。找到之后点一下,有时候是恢复窗口,有时候是新建窗口,有时候窗口弹出来却没拿到焦点,还得再点一次标题栏。

这种来回切换的成本,平时不觉得,但次数多了非常消磨心流。更麻烦的是,如果你开了多个项目终端,找“刚才那个跑着服务的终端”简直像在玩记忆翻牌游戏。我甚至见过有人为了不让终端被挡住,干脆把它放在另一个虚拟桌面里,切过去用一会再切回来——这依然要动键盘之外的交互。

我真正想要的,是一个不需要用眼睛找、不需要用鼠标点、在任何程序里都能呼出的“终端入口”。按一下组合键,xterm 出现在前台并拿到焦点;再按一下,它藏起来不挡屏幕。这个操作成本比任何启动器、任务栏、虚拟桌面都要低。

1.2 为什么要选择 xterm 而不是别的终端

有人可能会问,现在有那么多花哨的终端模拟器,为什么偏偏用 xterm?其实恰恰是它的“朴素”在这个场景里成了优势。

第一,启动快。xterm 本质上就是一个最精简的 X11 终端窗口,没有标签页、没有插件加载、没有复杂的渲染层。在低配机器上,按下快捷键到窗口出现,几乎感觉不到延迟。换来的是“呼之即来”的爽快感。

第二,窗口逻辑简单。大多数终端程序支持多标签页,一个进程对应多个窗口,这让“唤醒某个终端”的判断变得很麻烦。而 xterm 基本是“一个进程对应一个窗口”,状态判断非常干净,后面写脚本也好写。

第三,不挑环境。它运行时只依赖 Xlib 基础库,不像某些现代终端那样对图形栈有一堆要求。无论你用的是完整桌面环境还是极简窗口管理器,它都能稳定工作。

我自己的用法是:把 xterm 当作一个“临时命令入口”,专门跑那些几秒钟就能结束的命令,看 man 手册、查端口、跑个 Python 脚本,而不需要专门打开我的主力终端。长远看,它比在重型终端里不断开新标签页更轻巧。当然,xterm 的字体和配色比较素,但这完全可以通过 Xresources 调整,跟今天的主题无关,就不展开了。

2. 方案选型:全局键监听的几种常见路子

2.1 桌面环境自带快捷键的局限性

很多人第一反应是:我的桌面环境不就有自定义快捷键功能吗?确实,GNOME、KDE 这类完整桌面环境,以及 i3、Openbox、awesome、dwm 这类窗口管理器,都能绑定一个快捷键去执行命令。你只要把命令填成“打开 xterm”就行。

这个方案本身没问题,局限性在于它被“绑定”在了特定的桌面环境或窗口管理器上。比如你在 i3 的配置文件里写bindsym,换到另一个窗口管理器就得重新学一套写法;换成 GNOME 又得去图形设置界面里点半天。万一你平时在不同环境之间切换,这套快捷键方案就得在每个环境里各维护一次。而且窗口管理器提供的快捷键,通常只负责“触发命令”,不关心“目标程序当前是什么状态”——到底是新建窗口、激活窗口还是最小化窗口,这些逻辑都得你自己写到脚本里。

所以我的结论是:如果只是临时用,桌面环境的快捷键足够;但如果想做一个不依赖特定桌面、能完整处理窗口状态的工具,还是得在更底层一点的地方做全局按键监听。

2.2 xbindkeys 与 XGrabKey:轻量但功能偏“触发”

xbindkeys 是 X11 下一个老牌的全局快捷键守护程序。它的原理很简单:调用 X11 提供的 XGrabKey 接口,向 X server 声明“某些组合键归我管”。声明成功之后,无论当前焦点落在哪个窗口,只要你按下这个组合键,X server 就会把事件交给 xbindkeys 处理,由它去执行你配置的命令。

这种方式的优点是:独立于桌面环境,只要你在 X11 会话里,它就生效;没有复杂的依赖,配置一个文本文件就能跑。缺点是:它只负责“检测到按键 -> 执行命令”,不会替你去判断窗口是开着还是关着、要不要最小化。这些逻辑你得写进它调用的脚本里。而且因为用了 XGrabKey 全局抓取,这个组合键在其它程序里就失效了——比如某个应用内部也想用 Ctrl+Alt+T,那它抢不到。

对多数人来说,xbindkeys 已经足够。你要做的,是写一个聪明的 shell 脚本来配合它的“触发”能力。

2.3 自写守护进程:从“触发”进化到“状态管理”

如果你想要更完整的体验,比如“已在前台则隐藏,不在前台则激活,没启动则新建”,并且希望逻辑都在一个程序里闭环,那可以考虑自写一个常驻后台的守护进程。

在 Python 生态里,可以用 pynput 或 python-xlib 这类库监听全局键盘事件。这类库的底层通常走 X11 的事件监听通道,不像 XGrabKey 那样直接抢占组合键,它更像是在旁边“看”键盘事件流。好处是你能拿到完整的按键上下文,比如用户按下了哪些修饰键、当前焦点窗口是谁,然后自己决定下一步做什么。窗口操作部分则可以交给 wmctrl、xdotool 这类 X11 窗口管理工具,它们能完成激活、最小化、查询状态等操作。

自写守护进程的另一个价值是可扩展性。今天你想按 Ctrl+Alt+T 唤醒 xterm,明天可能想按 Ctrl+Alt+E 唤醒编辑器,后天想针对不同显示器设置不同的触发行为。这些逻辑写成代码之后,改起来比堆 shell 脚本要清晰得多。

2.4 一张对比表帮你做决定

方案依赖复杂度功能弹性适用场景
桌面环境自带快捷键依赖具体桌面或窗口管理器极低弱,只能触发命令临时使用,不想装额外工具
xbindkeys + shell 脚本xbindkeys、wmctrl、xdotool低中等,能处理大多数状态追求轻量,习惯写 shell
Python 守护进程Python、pynput、wmctrl、xdotool中强,可精确控制窗口状态想要 toggle 效果、后续扩展

我的建议是:新手或者只求“能呼出就行”,走 xbindkeys 方案;如果你对体验有要求,希望按一下是“呼出/隐藏”的切换效果,那就直接上 Python 守护进程。我下面两个方案的完整实现都会给出,你可以先跑通一个,再对比着看。

3. 实操方案一:xbindkeys + Shell 脚本的轻量组合

3.1 安装依赖与准备环境

xbindkeys 方案的依赖不多,核心是三样:xbindkeys 负责捕获组合键,wmctrl 负责激活已有窗口,xdotool 负责查询当前活动窗口、执行最小化。发行版对应的安装命令大致是这样:

# Debian / Ubuntu sudo apt install xbindkeys xdotool wmctrl xterm # Arch / Manjaro sudo pacman -S xbindkeys xdotool wmctrl xterm # Fedora sudo dnf install xbindkeys xdotool wmctrl xterm

装完之后,可以先确认一下工具版本和工作状态:

which xbindkeys wmctrl xdotool

3.2 唤醒脚本的编写与坑点

先写唤醒脚本,我的习惯是把这类个人脚本放在~/bin目录下,方便统一管理:

mkdir -p ~/bin vim ~/bin/xterm_wake.sh

脚本内容如下:

#!/bin/bash # 获取当前活动窗口的 WM_CLASS,xdotool 会输出两行,比如 xterm / XTerm ACTIVE_CLASS=$(xdotool getactivewindow getwindowclassname 2>/dev/null) # 如果当前活动窗口就是 xterm,则最小化它 case "$ACTIVE_CLASS" in *xterm*) ACTIVE_ID=$(xdotool getactivewindow) xdotool windowminimize "$ACTIVE_ID" exit 0 ;; esac # 否则尝试激活已有的 xterm 窗口;没有则新建 if wmctrl -x -a xterm.XTerm 2>/dev/null; then exit 0 fi xterm &

写完别忘了加执行权限:

chmod +x ~/bin/xterm_wake.sh

这里有三个新手最容易踩的坑,我必须单独拿出来讲。

第一个坑是wmctrl -x -a后面的窗口匹配格式。-x表示用 WM_CLASS 来匹配,格式是“实例名.类名”。不同终端模拟器的 WM_CLASS 不一样,有的叫xterm.XTerm,有的叫XTerm。你最好先跑一下命令确认:

wmctrl -lx | grep -i xterm

输出类似这样:

0x03400007 0 xterm.XTerm 主机名 无标题终端

看到xterm.XTerm,你的脚本里才写这个值。如果你用的是 urxvt,这里就是urxvt.URxvt;用 alacritty 可能是Alacritty.Alacritty。照抄别人的脚本之前,务必先检查自己的窗口类名。

第二个坑是xdotool getwindowclassname的输出可能包含多行。它会把实例名和类名分别打印出来,所以你在 shell 里用ACTIVE_CLASS=$(...)拿到的可能是两行文本。不要直接用if [ "$ACTIVE_CLASS" = "xterm" ]这种精确等于判断,那样在对的时候靠运气,错的时候一脸懵。上面脚本里用case "$ACTIVE_CLASS" in *xterm*)做模糊匹配,就是为了一次把两行都涵盖进去。

第三个坑是xterm &和脚本退出的关系。如果你在脚本末尾用exec xterm,它会把脚本进程替换成 xterm 进程,这在某些情况下会导致窗口保持意外状态;如果只写xterm而不加后台符号,脚本会一直等着窗口关闭才返回,快捷键的响应就会卡住。最稳妥的写法就是xterm &,让 xterm 在后台启动,脚本立刻结束。

3.3 注册组合键并测试生效

接下来配置 xbindkeys。先让它生成一份默认配置,方便查看格式:

xbindkeys --defaults > ~/.xbindkeysrc

然后在文件末尾加上我们的绑定:

"$HOME/bin/xterm_wake.sh" Control + Alt + t

注意 xbindkeys 的语法:第一行是要执行的命令,第二行是组合键描述,两部分之间用空格或 Tab 缩进,没有严格的等号。描述里的键名要写全称,比如Control、Alt、t,中间用空格和加号连接。

保存之后重启 xbindkeys 让配置生效:

killall xbindkeys xbindkeys

想要调试验证的话,可以直接前台运行 xbindkeys 看它有没有捕获到按键:

xbindkeys -n -f ~/.xbindkeysrc

-n表示不进入后台,按键按下时命令行会打印触发信息。如果按了没反应,先用xev确认你的按键确实能被 X11 识别,再排查配置文件路径和命令路径。

一切正常后,整个交互应该是这样的:

  • 当前没有任何 xterm 窗口,按 Ctrl+Alt+T,一个新的 xterm 弹出来并拿到焦点。
  • 焦点在浏览器等其它窗口时,按 Ctrl+Alt+T,已有的 xterm 窗口被激活并跑到最前面。
  • 焦点已经在 xterm 上时,再按一次 Ctrl+Alt+T,窗口最小化,让你看清下面的桌面。

这个“再按一次就隐藏”的 toggle 行为,就是方案一里脚本的核心价值。但要注意,如果你同时开着多个 xterm,wmctrl -x -a xterm.XTerm激活的是列表里的第一个,不会智能选择“最近使用过的那个”。对于这个需求,升级到方案二会更顺手。

4. 实操方案二:Python 守护进程与智能 toggle

4.1 程序整体逻辑

方案二本质上就是把方案一的脚本逻辑搬进一个常驻 Python 进程里,再加上更精细的按键判定。我希望达到的效果同样是三态切换:xterm 在前台就最小化它,xterm 存在但不在前台就激活它,xterm 还没启动就新建它。区别在于,Python 代码里可以清晰地把“组合按键判定”“窗口状态查询”“动作执行”拆成函数,后续想扩展也好下手。

整个程序的状态机可以这样描述:

  1. 用户按下 Ctrl+Alt+t,触发 toggle。
  2. 程序先检查当前活动窗口是不是 xterm;如果是,最小化活动窗口,流程结束。
  3. 如果不是,尝试用 wmctrl 激活已有 xterm 窗口;如果激活失败,说明没有实例,直接 Popen 启动一个 xterm。

这里有一个人必须处理的问题:键盘重复触发。如果你按住 Ctrl+Alt+t 不放,系统会因为按键重复而连续触发多次 toggle,结果就是窗口在一秒内疯狂最小化、激活、最小化、激活。所以程序里必须加上防抖机制,也就是记录上一次触发的时间,间隔小于某个阈值就忽略本次触发。这个细节我实测中踩过,不处理的话根本没法用。

4.2 完整代码实现

开始之前,先安装 Python 的 pynput 库:

pip install pynput

如果用的是系统 Python,也可以装发行版提供的包,例如 Debian 系是python3-pynput。

完整代码如下:

#!/usr/bin/env python3 import subprocess import time from pynput import keyboard # 目标终端程序的窗口类名关键字,用于判断当前焦点窗口 XTERM_CLASS_KEYWORD = "xterm" # 组合键中的普通按键,这里用小写字母 t # 注意 Ctrl 和 Alt 用的是修饰键对象,不区分左右 HOTKEY_CHAR = "t" # 防抖间隔,单位:秒 DEBOUNCE_INTERVAL = 1.5 pressed_keys = set() last_trigger_time = 0.0 def is_active_window_xterm(): """查询当前活动窗口的 WM_CLASS,判断是否为 xterm。""" try: out = subprocess.check_output( ["xdotool", "getactivewindow", "getwindowclassname"] ).decode().strip().lower() return XTERM_CLASS_KEYWORD in out except Exception: return False def activate_existing_xterm(): """尝试激活已存在的 xterm 窗口。""" try: subprocess.run( ["wmctrl", "-x", "-a", "xterm.XTerm"], check=True, stdout=subprocess.DEVNULL ) return True except subprocess.CalledProcessError: return False def toggle_xterm(): """执行一次主逻辑:前台就最小化,否则激活或新建。""" global last_trigger_time now = time.time() if now - last_trigger_time < DEBOUNCE_INTERVAL: return last_trigger_time = now if is_active_window_xterm(): try: active_window_id = subprocess.check_output( ["xdotool", "getactivewindow"] ).decode().strip() subprocess.run(["xdotool", "windowminimize", active_window_id]) except Exception: pass return if not activate_existing_xterm(): subprocess.Popen(["xterm"]) def hotkey_matched(): """检查当前按下的按键集合是否满足 Ctrl+Alt+t。""" has_ctrl = keyboard.Key.ctrl_l in pressed_keys or keyboard.Key.ctrl_r in pressed_keys has_alt = keyboard.Key.alt_l in pressed_keys or keyboard.Key.alt_r in pressed_keys has_hotkey = any( hasattr(key, "char") and key.char == HOTKEY_CHAR for key in pressed_keys ) return has_ctrl and has_alt and has_hotkey def on_press(key): pressed_keys.add(key) if hotkey_matched(): toggle_xterm() def on_release(key): pressed_keys.discard(key) def main(): with keyboard.Listener(on_press=on_press, on_release=on_release) as listener: listener.join() if __name__ == "__main__": main()

把代码保存为~/bin/xterm_wake.py,加执行权限:

chmod +x ~/bin/xterm_wake.py

先在前台跑一下看看有没有报错:

python3 ~/bin/xterm_wake.py

按几次 Ctrl+Alt+T,确认 xterm 的显示、隐藏、新建三种行为都符合预期,再把它放到后台常驻。

4.3 关键实现:按键监听与组合判定

代码里pressed_keys是一个集合,专门记录当前“按住没松开”的按键。pynput 的监听器在每次按下和释放时都会回调,我们把 key 对象存进集合,释放时再移除。这样判断组合键时,只需要检查集合里是否同时包含需要的修饰键和普通键。这个模型比维护“上一次按下的键”这种状态要直观得多,也不会丢失按键顺序信息。

这里有个容易疏忽的细节:Ctrl+Alt+t 里的 t,在不同键盘布局或者大写锁定状态下,key.char可能变成"T"。我自己用的是英文布局,平时也没开大写,所以小写判断够用。如果你希望更稳,可以把判断改成key.char and key.char.lower() == "t",这样大小写通吃。但要注意,这也会让 Ctrl+Alt+Shift+T 也被识别成触发组合,因为按下 Shift 时 t 的 char 是"T",lower() 之后也是 t。如果你不希望 Shift 参与进来,还得把 Shift 排除在 pressed_keys 之外。我个人建议保持简单,就用小写 t,毕竟全局热键本来就该避免和系统里其它快捷键冲突。

另一个值得说的是防抖参数DEBOUNCE_INTERVAL。它的实质是允许两个相邻触发之间最少间隔 1.5 秒。这个值不能说越大越好:太小了挡不住系统按键重复;太大了会导致你快速连按时,第二次触发被忽略。我试过 0.5 秒仍然偶尔会闪,1.5 秒在“连按两次”的场景下基本够用。如果你习惯快速双击,可以改成 0.8 左右,找到自己的平衡点。

4.4 开机自启动与日志

守护进程类工具,最麻烦的是忘记开机自启、又找不到进程在跑。我建议用 systemd 用户服务来管理,这样既能开机自动启动,还能通过日志快速排查问题。

创建一个 service 文件:

mkdir -p ~/.config/systemd/user vim ~/.config/systemd/user/xterm-wake.service

内容如下:

[Unit] Description=xterm global hotkey daemon After=graphical-session.target [Service] Type=simple Environment=DISPLAY=:0 ExecStart=/usr/bin/python3 /home/你的用户名/bin/xterm_wake.py Restart=on-failure [Install] WantedBy=default.target

然后启用并启动服务:

systemctl --user daemon-reload systemctl --user enable xterm-wake.service systemctl --user start xterm-wake.service

这里有个必须注意的点:X11 程序需要 DISPLAY 环境变量才知道往哪个显示器上画窗口。在图形会话里手动执行脚本时,环境变量是继承的,一切正常;但 systemd 用户服务默认拿不到图形会话里的 DISPLAY 值,所以要在 service 文件里显式写上。DISPLAY=:0是绝大多数单用户本地机器的值,如果你的环境特殊,可以先执行echo $DISPLAY查看当前会话的实际值,再填进去。

查看服务状态和日志的命令:

systemctl --user status xterm-wake.service journalctl --user -u xterm-wake.service -f

如果你不想用 systemd,也可以把启动命令写进窗口管理器或桌面的自启动配置里。总之,核心目标就一个:登录图形会话后,这个监听进程要常驻,并且能看到 DISPLAY。

5. 常见问题与排查速查

5.1 按了没反应

这是最多人遇到的情况。按快捷键毫无反应,先不要怀疑程序逻辑,按下面的顺序排查。

第一步,确认监听进程确实在跑。如果是 xbindkeys,执行pgrep -a xbindkeys;如果是 Python 守护进程,执行pgrep -f xterm_wake.py。没在跑就重新启动,并确认有没有报环境变量或 Python 模块缺失的错误。

第二步,确认组合键有没有被其它东西占用。先关掉 xbindkeys 或者 Python 守护进程,打开xev,在窗口里按下 Ctrl+Alt+t,看看 X server 是否收到了对应事件。如果xev都收不到,说明这个组合键被更底层的机制截走了,比如 Linux 虚拟终端的切换键,或者是桌面环境、输入法抢先注册了同名快捷键。

第三步,用前台模式跑一次监听程序,直接观察有没有输出和报错。xbindkeys 用xbindkeys -n -f ~/.xbindkeysrc,Python 脚本直接python3 xterm_wake.py。前台模式下,按键是否触发、脚本里的异常都会直接暴露出来。

5.2 窗口激活不成功

xterm 启动了,但 wmctrl 激活不了已有窗口,弹不到最前面。这里十有八九是 WM_CLASS 匹配问题。先用wmctrl -lx看目标窗口的真实类名,确认你脚本里写的xterm.XTerm和实际显示一致。不同 xterm 版本甚至不同启动参数,实例名都可能有差异。

另一个更隐蔽的原因是:你的窗口管理器不完全支持 EWMH 协议。wmctrl 本质上是通过 EWMH 的_NET_ACTIVE_WINDOW消息来请求窗口管理器激活窗口的,如果窗口管理器不响应这个协议,wmctrl 就会失败。这种情况比较少见,但在极简的、自写的窗口管理器上确实存在。替代做法是用 xdotool 的windowactivate命令,它绕过的机制不同,往往能救场。

5.3 触发后窗口疯狂闪烁

按下组合键的瞬间,xterm 不停地最小化、激活、再最小化。这说明你的 toggle 逻辑被执行了多次,原因几乎都是键盘重复触发。按住按键时,系统按固定频率发送重复按键事件,每次事件都把 toggle 跑一遍。

解决方案就是加防抖。方案一的 shell 脚本里也可以加,用last_trigger时间戳做简单比较;方案二代码里已经有DEBOUNCE_INTERVAL,只需确认你没把它设成 0。防抖时间设成多少合适,我在前面说过,一般 0.5 到 1.5 秒都算合理范围,太短没用,太长影响体验。

5.4 环境兼容:X11 与 Wayland

整个项目从原理上就是建立在 X11 的事件模型上的。无论 xbindkeys 的 XGrabKey,还是 pynput 的全局事件监听,在 X11 会话里都能正常工作。但现在的 Linux 发行版越来越多默认使用 Wayland 会话,Wayland 出于安全设计,禁止普通应用全局监听或拦截其它应用的键盘输入,所以这套程序在 Wayland 下通常直接失效。

判断你当前会话类型的方法很简单:

echo $XDG_SESSION_TYPE

输出x11就放心用;输出wayland就得另想办法,比如改用桌面环境自己提供全局快捷键功能,或者考虑在 XWayland 兼容层里跑,但稳定性和行为都可能打折扣。这也是为什么我在文章开头强调“X11 会话”这个前提。

5.5 几个值得调整的小参数

跑通之后,建议再花几分钟看看这几个可调项,它们能让体验更贴合你的习惯:

  • 热键选择:Ctrl+Alt+T 是个很通用的组合,但有些输入法或远程桌面工具会用它,冲突时可以考虑换成 Super + T 或者单独的 F12 键。F1-F6 这类组合建议避开,因为某些发行版把它们预留给了虚拟终端切换。
  • WM_CLASS 关键字:如果你把 xterm 换成了其它终端,修改XTERM_CLASS_KEYWORD和wmctrl -x -a后面的类名即可。这个关键字尽量用类名而不要用窗口标题,因为终端窗口的标题经常变化,类名则相对稳定。
  • 多显示器环境:默认情况下,快捷键唤出的窗口会出现在当前桌面/工作区。如果你希望它总在某个显示器上出现,可以额外用 wmctrl 或 xdotool 把窗口移动到指定位置和几何尺寸,这部分留给你自己扩展。

写在最后的个人经验

这套东西我断断续续用了很久,从最初的 xbindkeys 单键呼出,到我今天用的 Python 守护进程,最大的体会是:工具不在多,在于“顺手”。把终端唤出的成本降到最低之后,我敲命令的频率明显变高了——很多以前觉得“切窗口太麻烦就算了”的小操作,现在会随手做掉。像临时起个 HTTP 服务、查一下端口占用、看一眼日志尾部,这些动作不再需要打断思路去找窗口。

如果你也想搞一个类似的工具,我真心建议不要一上来就写守护进程。先用 xbindkeys 加脚本跑通流程,确认这个交互方式真的符合自己的习惯,再考虑要不要升级成方案二。工具是为人服务的,别让它变成另一个需要维护的负担。最后留一个小技巧:把脚本里的触发日志写到文件里,比如echo "$(date) trigger" >> /tmp/xterm_wake.log,前期调试会特别省心,等稳定了再关掉就行。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进