Linux下定向捕获指定进程交互会话用于调试重放的方案咨询
Linux平台指定进程交互与UI录制方案
以下方案均满足无全局屏幕捕获、仅绑定目标进程/对应窗口、低资源占用、支持后台常驻、环形缓存触发留存的要求,全部基于Linux原生工具链实现,无重型依赖。
方案1:X11环境(最贴近x11vnc使用逻辑,部署成本最低)
- 窗口定向捕获:
x11vnc原生支持单窗口绑定,启动时传入-id <窗口ID>参数即可仅捕获对应窗口的渲染内容,完全不会采集其他窗口画面。配合xdotool search --pid <目标进程PID>可以自动根据进程PID查询关联窗口ID,无需手动指定;如果目标进程会弹出多个子窗口,写个简单shell脚本遍历进程下所有顶层窗口ID批量绑定即可。 - 定向输入事件捕获:不需要全局监听输入设备,直接用
xev -id <窗口ID>挂载到目标窗口,仅采集发送到该窗口的按键、鼠标点击、移动、滚轮事件,事件日志按时间戳落盘,常驻CPU占用低于0.5%。 - 环形缓存与异常触发留存:
x11vnc支持将捕获的帧数据输出到标准输出,直接管道传给ffmpeg做环形分段录制,默认仅保留最近N分钟的内容写入临时目录,平时会自动覆盖旧片段;通过shell脚本监听目标进程状态(用wait命令跟踪进程PID、或监控coredump生成路径),一旦检测到进程崩溃、异常退出,立即停止环形覆盖,将当前缓存的视频片段和事件日志转存到持久化目录。
核心启动参考命令:
该组合常驻内存占用约30-60MB,常规桌面应用场景下CPU占用低于3%。# 查询目标进程关联的主窗口ID TARGET_WID=$(xdotool search --pid $TARGET_PID | head -n1) # 启动单窗口捕获,ffmpeg配置为保留最近10段、每段60秒的环形缓存 x11vnc -id $TARGET_WID -nocursor -nopw -quiet -o /dev/null - | \ ffmpeg -hide_banner -loglevel error -i - \ -f segment -segment_time 60 -segment_wrap 10 -segment_format mp4 \ -c:v libx264 -preset ultrafast -crf 28 /tmp/app_rec_cache_%02d.mp4
方案2:Wayland环境原生实现
Wayland下x11vnc无法直接工作,使用协议原生支持的定向捕获能力即可,同样不会采集全局内容:
- UI定向捕获:通过
pipewire配合xdg-desktop-portal的窗口专属捕获接口,仅申请目标窗口的捕获权限,使用wf-recorder指定窗口ID输出帧数据,后续环形缓存、触发留存的逻辑和X11方案完全一致,同样管道给ffmpeg处理即可。 - 输入事件捕获:通过Wayland协议的窗口事件监听接口,仅采集派发到目标窗口的输入事件,不需要监听全局输入设备,无隐私泄漏风险。
方案3:进程注入级捕获(隐私合规性最高,无越界捕获可能)
如果需要100%确保不会采集到目标进程外的任何内容(包括窗口被其他程序遮挡时的画面、全局快捷键等无关内容),可以用LD_PRELOAD注入的方式从进程内部采集数据:
- 基于
apitrace做轻量裁剪,hook目标进程的图形渲染接口(X11事件接口、Wayland surface提交接口、OpenGL/Vulkan的swapbuffer接口),直接从进程内部拿到渲染帧和派发到进程的所有输入事件,不需要经过窗口系统的屏幕拷贝路径,资源占用比窗口捕获方案低30%以上。 - 环形缓存逻辑直接在注入的动态库中实现,检测到进程崩溃(捕获SIGSEGV、SIGABRT等异常信号)时自动将缓存内容写入磁盘,完全不需要外部脚本配合,适配成本稍高,适合对隐私要求极严格的场景。
配置提示:临时缓存目录可以挂载为tmpfs,减少物理磁盘写入损耗;视频帧和事件日志统一打对齐的时间戳,回放时直接用ffmpeg播放视频,对照事件日志的时间点即可完整复现操作路径,不需要专用回放工具。
内容的提问来源于stack exchange,提问作者Jason Iversen
相关产品推荐
相关产品推荐

