ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WezTerm 进程信息 Lua 模块 wezterm.procinfo 完全指南:查询 PID、工作目录与进程树

WezTerm 进程信息 Lua 模块 wezterm.procinfo 完全指南:查询 PID、工作目录与进程树 WezTerm 进程信息 Lua 模块 wezterm.procinfo 完全指南查询 PID、工作目录与进程树【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm导读wezterm.procinfo是 WezTerm 内置的 Lua 模块用于在配置脚本中查询本地系统上运行进程的相关信息例如当前进程的 PID、指定进程的可执行文件路径、当前工作目录以及以指定 PID 为根的完整进程树。借助该模块你可以在 WezTerm 的 Lua 配置与事件钩子中读取进程元数据从而实现按进程环境定制界面/行为的实战方案。读完本文你将掌握该模块 4 个函数的全部用法、返回对象字段含义以及它在 Linux / macOS / Windows 三套平台下的底层实现原理。模块概览wezterm.procinfo自版本20220807-113146-c2fee766起可用见 模块主文档。它是一个只读的进程信息查询接口不与终端模拟或多路复用逻辑耦合专注于回答三个问题当前进程是谁PID 是多少某个 PID 对应的程序在哪、在哪个目录下运行某个 PID 及其子孙进程构成了怎样的进程树该模块共暴露 4 个函数全部为同步调用、无参数或单参数PID并遵循查不到即返回nil的约定不会在脚本中抛错。函数注册入口见 procinfo-funcs 的 Lua 绑定源码。函数参数返回值wezterm.procinfo.pid()无当前进程的 PID整数wezterm.procinfo.current_working_dir_for_pid(pid)pid: u32进程当前工作目录字符串或nilwezterm.procinfo.executable_path_for_pid(pid)pid: u32进程可执行映像的完整路径字符串或nilwezterm.procinfo.get_info_for_pid(pid)pid: u32进程信息对象LocalProcessInfo或nil四个 API 函数详解pid()获取当前进程 PID wezterm.procinfo.pid()返回调用时所在进程的进程标识符。在 Lua 绑定中它直接封装了 C 库的libc::getpid()见 procinfo-funcs 注册代码因此语义与 POSIXgetpid完全一致得到的是当前正在执行脚本的 WezTerm 进程通常是wezterm-gui的 PID。官方文档见 pid()。该函数通常不单独使用而是作为另外三个函数的基础参数例如查询我自己在哪个目录下工作 wezterm.procinfo.current_working_dir_for_pid(wezterm.procinfo.pid())current_working_dir_for_pid(pid)查询进程当前工作目录 wezterm.procinfo.current_working_dir_for_pid(wezterm.procinfo.pid()) /home/wez/wez-personal/wezterm给定一个 PID返回该进程的当前工作目录的绝对路径。若无法获取进程已退出、权限不足或平台不支持返回nil。官方文档见 current_working_dir_for_pid(pid)。在绑定层返回值经过了PathBuf→str→String的转换若路径本身无法转为 UTF-8 字符串也会得到nil见 procinfo-funcs/src/lib.rs。executable_path_for_pid(pid)查询进程可执行文件路径 wezterm.procinfo.executable_path_for_pid(wezterm.procinfo.pid()) /home/wez/wez-personal/wezterm/target/debug/wezterm-gui给定一个 PID返回该进程可执行映像executable image的完整路径。官方文档见 executable_path_for_pid(pid)。与current_working_dir_for_pid相同查不到时返回nil。值得注意的是可执行映像路径与进程的name字段并不总是相同可执行路径反映的是磁盘上的真实二进制位置而进程名可能被setproctitle()之类的手段在运行时改写源码注释对此有明确说明见 procinfo/src/lib.rs。get_info_for_pid(pid)获取结构化进程信息 wezterm.procinfo.get_info_for_pid(wezterm.procinfo.pid()) { argv: [ /home/wez/wez-personal/wezterm/target/debug/wezterm-gui, ], children: { 540513: { argv: [ -zsh, ], children: {}, cwd: /home/wez, executable: /usr/bin/zsh, name: zsh, pid: 540513, ppid: 540450, start_time: 232656896, status: Sleep, }, }, cwd: /home/wez/wez-personal/wezterm, executable: /home/wez/wez-personal/wezterm/target/debug/wezterm-gui, name: wezterm-gui, pid: 540450, ppid: 425276, start_time: 8671498240, status: Run, }这是 4 个函数中信息最丰富的它不仅返回目标进程自身的元数据还会递归构建其全部子孙进程的树形结构见上面的children嵌套表。官方文档见 get_info_for_pid(pid)。LocalProcessInfo进程信息对象的字段语义get_info_for_pid返回的对象类型名为LocalProcessInfo在配置目录中还有一份独立的字段参考文档其中每个字段都能在 Rust 结构体定义 中找到对应实现字段类型含义pid整数进程标识符ppid整数父进程标识符name字符串进程的 COMM 短名。受平台限制可能被截断许多系统截断到 15~16 字符或与实际可执行映像无关建议优先使用executable/argvexecutable字符串可执行映像的完整路径可能为空字符串argv表进程的参数数组。部分系统允许进程在运行时改写 argv 块如setproctitle()cwd字符串进程当前工作目录不可访问时可能为空路径status字符串进程状态取值为Idle、Run、Sleep、Stop、Zombie、Tracing、Dead、Wakekill、Waking、Parked、LockBlocked、Unknownstart_time整数一个以系统相关单位为计数的时钟值用于指示进程的相对年龄并非所有平台都可移植children表以子进程 PID 为键、值为LocalProcessInfo的嵌套表构成进程树状态枚举定义于 procinfo/src/lib.rs其值在 Linux 上直接映射自/proc中的状态字母见下文。文档层面LocalProcessInfo还与 mux-is-process-stateful 事件和 pane:get_foreground_process_info() 相关联可用于判断会话是否仍然存活。跨平台底层实现原理wezterm.procinfo的价值在于屏蔽了三个主流桌面平台截然不同的进程查询机制。Rust crate procinfo 按目标平台编译对应实现非三大平台的系统with_root_pid等一律返回None见 procinfo/src/lib.rs#L85-L98。Linux直接读取 /proc 伪文件系统Linux 实现procinfo/src/linux.rs完全基于/proc虚拟文件系统current_working_dir(pid)对/proc/{pid}/cwd符号链接执行read_link见 linux.rs#L23-L25executable_path(pid)对/proc/{pid}/exe符号链接执行read_link见 linux.rs#L27-L29with_root_pid(pid)枚举/proc下所有数字目录得到进程清单逐进程解析/proc/{pid}/stat提取名称、状态、PPID 与starttime字段读取/proc/{pid}/cmdline并按\0分割还原 argv然后按 PPID 关系递归组装成进程树见 linux.rs#L31-L145。Linux 状态字母到LocalProcessStatus的映射也集中在这份文件里R→Run、S→Sleep、D→Idle、Z→Zombie、T→Stop、t→Tracing、X/x→Dead、K→Wakekill、W→Waking、P→Parked未知值归入Unknown见 linux.rs#L4-L20。macOSlibc 进程信息 APImacOS 实现procinfo/src/macos.rs调用系统 libc 接口工作目录通过proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, ...)获取proc_vnodepathinfo结构体再读取其中的vip_path字节序列并定位\0结尾转为字符串见 macos.rs#L20-L49可执行路径通过proc_pidpath()获取缓冲区大小为PROC_PIDPATHINFO_MAXSIZE见 macos.rs#L51-L60状态枚举由Fromu32转换而来分别映射Idle、Run、Sleep、Stop、Zombie及Unknown见 macos.rs#L6-L17。WindowsToolhelp32 快照与 NT 查询接口Windows 实现procinfo/src/windows.rs技术栈最为繁复先通过CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, ...)拍摄进程快照并逐条迭代PROCESSENTRY32W见 windows.rs#L24-L60进程详细信息依赖NtQueryInformationProcess读取 PEB /RTL_USER_PROCESS_PARAMETERS并通过ReadProcessMemory从目标进程内存中读出参数块同时兼容 32 位进程RTL_USER_PROCESS_PARAMETERS32可执行路径使用QueryFullProcessImageNameW命令行使用CommandLineToArgvW拆分见 windows.rs#L1-L21。实战应用场景场景一配置中获取 shell 的真实工作目录在事件回调例如根据前台进程环境改变配色或标题里你可以组合使用pid()与current_working_dir_for_pid()local proc wezterm.procinfo local me proc.pid() local cwd proc.current_working_dir_for_pid(me) if cwd ~ nil then -- 在 wezterm-gui 进程自己的工作目录基础上做判断 end场景二遍历进程树、识别子 shellget_info_for_pid返回的children是嵌套表。以文档示例为例wezterm-guiPID 540450的子树下挂着一个zshPID 540513PPID 540450通过递归遍历children即可还原终端 → shell的父子链路local function walk(proc) wezterm.log_info(string.format( pid%s name%s cwd%s exe%s, proc.pid, proc.name, proc.cwd, proc.executable )) for _, child in pairs(proc.children or {}) do walk(child) end end local info wezterm.procinfo.get_info_for_pid(wezterm.procinfo.pid()) if info then walk(info) end场景三进程间数据传递passing-data在 传递数据的配方文档 中wezterm.procinfo.get_info_for_pid()被推荐为在 WezTerm 各组件GUI 进程与 mux server 等之间传递进程信息的标准途径——需要进程详情的一方直接按 PID 向wezterm.procinfo模块查询从而避免在 IPC 协议里搬运整棵进程树。这种方式天然轻量调用方只在需要时才真正去操作系统查询且不同平台由同一套 Lua API 屏蔽差异。注意事项与限制版本门槛整个模块自20220807-113146-c2fee766起才存在更早的 WezTerm 无法使用配置中引用前请先做版本判断。返回nil的三种情形进程不存在/已退出、权限不足导致内核拒绝查询、路径或参数无法转换为合法 UTF-8 字符串。字段可靠性name可能被截断常见于 15~16 字符限制或被setproctitle改写executable与cwd在某些场景下可能为空字符串start_time的单位是系统相关的只适合做相对比较不要跨平台假设其含义。平台支持完整的get_info_for_pid仅保证在 Linux、macOS、Windows 上实现其他目标平台从 lib.rs 的 cfg 分支 看一律返回nil。进程树成本get_info_for_pid需要枚举系统全部进程来组装children树Linux 上会遍历整个/proc在调用频率很高的钩子里注意开销避免每帧调用。延伸阅读wezterm.procinfo 模块主文档LocalProcessInfo 对象字段参考mux-is-process-stateful 事件pane:get_foreground_process_info()传递数据的实战配方底层实现Lua 绑定、进程信息结构定义、Linux 实现、macOS 实现、Windows 实现【免费下载链接】weztermA GPU-accelerated cross-platform terminal emulator and multiplexer written by wez and implemented in Rust项目地址: https://gitcode.com/GitHub_Trending/we/wezterm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表