Serenity OS pidof 命令完全指南:按进程名精确查找 PID 的实用工具
Serenity OS pidof 命令完全指南按进程名精确查找 PID 的实用工具【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenitypidof是 Serenity OS 用户态工具集中一个短小精悍的进程查询命令用于根据进程名称列出其对应的全部 PID是进程管理、脚本编排与系统排障时的常用基础工具。本文以官方手册页 pidof.md 为骨架结合 pidof.cpp 源码与底层 ProcessStatisticsReader 实现完整讲解其全部选项、退出行为、底层原理与实战用法并给出与pgrep、ps的选型对比。命令总览名称、语法与用途名称与作用pidof的功能一句话即可概括list pids for a given process name—— 给定一个进程名列出所有匹配进程的 PID。与pgrep不同pidof专注做“按名字找 PID”这一件事输出干净、便于直接喂给其他命令例如kill。语法格式$ pidof [-s] [-o pid] [-S separator] process-name选项可以组合使用顺序不限process-name是必需的位置参数即要搜索的进程名不带任何选项时pidof输出所有匹配进程的 PID多个 PID 之间以空格分隔末尾自动换行。选项详解-o、-s、-S手册页定义了三个选项以下逐项结合源码说明其精确语义。-o pid省略指定的 PIDOmit the given pid, or the parent process if the special value%PPIDis passed省略一个具体的数字 PID例如pidof -o 42 bash传入特殊值%PPID时省略的是当前 shell父进程自身的 PID即调用pidof的那个进程的父进程 PID。该逻辑在 pidof.cpp 的参数回调中实现当参数值为%PPID时调用getppid()取得父进程 PID否则用to_numberpid_t()将其解析为数值 PID两者都不可用时参数校验失败。匹配阶段pidof.cpp对options.pid_to_omit it.pid的进程直接continue跳过。-s单发模式只返回一个 PIDOnly return one pid启用后pidof在输出第一个匹配进程的 PID 后立即停止遍历pidof.cpp 的break。在循环脚本、需要拿 PID 去kill或做其他处理时非常实用可避免处理多个 PID 的歧义。-S separator自定义 PID 分隔符Useseparatorto separate multiple pids默认情况下多个 PID 之间以单个空格分隔源码中Options结构的默认值为 见 pidof.cpp。使用-S可以替换为任意字符串例如逗号、冒号或换行便于后续用cut、awk等工具进一步处理。输出拼接逻辑在 pidof.cpp除首个 PID 外每个 PID 前都会先输出该分隔符。位置参数process-nameprocess-name要搜索的进程名。它由 LibCore/ArgsParser 作为必需位置参数解析pidof.cpp。需要注意匹配语义源码中是严格字符串相等比较it.name ! options.process_name则跳过见 pidof.cpp不是子串匹配、不是正则匹配也不支持通配符。因此进程名必须写全例如pidof Shell与pidof shell是两次不同的查询。名称来源是内核进程表中进程的name字段从/sys/kernel/processes的 JSON 数据中读取。源码级原理pidof 是如何找到 PID 的数据来源/sys/kernel/processes伪文件系统pidof并非遍历/proc目录而是通过内核导出的进程统计接口获取全量进程信息。其核心调用链为pid_of() → Core::ProcessStatisticsReader::get_all() → Core::File::open(/sys/kernel/processes) → 解析 JSON → AllProcessesStatisticsget_all()的实现位于 ProcessStatisticsReader.cpp打开/sys/kernel/processes读取全部内容后按 JSON 解析逐进程构造ProcessStatistics结构含pid、pgid、ppid、uid、name、executable、tty等字段完整字段列表见 ProcessStatisticsReader.h同时解析每个进程下的threads线程数组得到线程级统计。安全加固pledge 与 unveilpidof启动时通过 Serenity OS 的系统调用做了最小权限声明pidof.cppTRY(Core::System::pledge(stdio rpath)); TRY(Core::System::unveil(/sys/kernel/processes, r)); TRY(Core::System::unveil(/etc/passwd, r)); TRY(Core::System::unveil(nullptr, nullptr));pledge(stdio rpath)仅允许标准 IO 与只读文件路径操作unveil只开放两个只读路径进程统计接口/sys/kernel/processes与用户数据库/etc/passwd后者用于将 UID 解析为用户名见 ProcessStatisticsReader.cpp 的username_from_uid缓存逻辑随后unveil(nullptr, nullptr)锁定文件系统视图禁止后续追加任何路径访问。这意味着即使pidof被攻破其攻击面也被限制在这两个只读文件之内体现了 Serenity OS 用户态工具普遍采用的纵深防御惯例。匹配与输出流程pid_of()的整体流程pidof.cpp读取全量进程统计遍历每个进程命中“名称相等”且“未被-o排除”的进程即输出其 PID首个 PID 直接输出后续 PID 前追加分隔符默认空格若启用-s输出首个 PID 后立即break只要输出过至少一个 PID就在行尾补一个换行符一个都没匹配到则不输出任何内容。实战示例以下示例基于手册页语法与源码行为推演可在 Serenity OS 终端中直接验证。基本用法列出所有同名进程的 PID$ pidof Shell 13 29 57排除当前 shell 自身父进程常用于脚本内防误杀$ pidof -o %PPID Shell 13 57只取一个 PID$ pidof -s Shell 13自定义分隔符便于交给其他命令解析$ pidof -S : Shell 13:29:57组合使用$ pidof -s -o %PPID Shell 13把 PID 直接传给 kill典型的脚本用法$ kill $(pidof -s -o %PPID myapp)与pgrep、ps的协作与选型手册页“See also”指向pgrep与ps两个命令三者同属进程查询工具族但定位各异工具核心能力适用场景pidof按进程名精确列出 PID输出纯净脚本中直接获取 PID、管道传给killpgrep功能更丰富的进程查询计数、忽略大小写、按 UID/新旧程度/运行时长过滤、反选、精确匹配等需要复杂过滤条件的查询详见 pgrep.mdps列出进程详情PID、TTY、命令行支持自定义列格式与按 PID/PPID/TTY/用户选择需要查看进程状态、父子关系、完整命令行时详见 ps.md三者都建立在同一份进程统计数据之上ps同样使用Core::ProcessStatisticsReader读取/sys/kernel/processes。因此选型时按“只要 PID 用 pidof需要过滤条件用 pgrep需要进程详情用 ps”的口诀即可。常见疑问与注意事项没匹配到进程时pidof不输出任何内容、返回退出码 0从 pidof.cpp 看无论是否匹配到都会返回0脚本中建议配合进程名确认或pgrep使用。进程名必须完整严格相等匹配不支持通配符与正则写错大小写或截断名称都会查不到。同名多实例同名进程默认全部列出多个 PID 以空格分隔-s只能保证取到遍历顺序中的第一个不能保证是“最新”或“最老”的进程需要该语义时请改用pgrep -n/pgrep -o。相关资源手册页Base/usr/share/man/man1/pidof.md工具源码Userland/Utilities/pidof.cpp底层进程统计读取器Userland/Libraries/LibCore/ProcessStatisticsReader.cpp 与 Userland/Libraries/LibCore/ProcessStatisticsReader.h兄弟命令手册Base/usr/share/man/man1/pgrep.md、Base/usr/share/man/man1/ps.md构建清单pidof.cpp的编译注册Userland/Utilities/CMakeLists.txt【免费下载链接】serenityThe Serenity Operating System 项目地址: https://gitcode.com/GitHub_Trending/se/serenity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考