开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载本文介绍 jc 项目中jc.parsers.needrestart解析器的完整用法与实现原理。needrestart -bbatch 模式是 Debian 系发行版在 apt 升级后提示哪些内核/服务需要重启的标准批量输出其NEEDRESTART-XXX: value行格式对人类友好、对脚本不友好。读完全文你将掌握该解析器的 CLI 两种调用方式、jc.parse模块调用方式、输出 Schema 及各字段含义、-p/-r参数的区别以及解析器源码中行分类、键名规范化raw 与 processed 两套命名和类型转换的实现细节。适用场景与兼容性前提needrestart由 Debian 的needrestart包提供在apt-get upgrade结束后运行通过比对运行中内核与已安装内核、已加载模块与磁盘上的服务依赖等给出需要重启的会话、服务列表。-b参数让其输出机器可读的批量格式这正是 jc 解析器的输入来源。该解析器的平台兼容性为linux这一约束在源码元数据中明确声明见 jc/parsers/needrestart.py 中info.compatible [linux]并由jc.utils.compatibility在每次解析时校验运行平台。CLI 两种调用方式文档给出了等价的两种命令行用法# 方式一管道 $ needrestart -b | jc --needrestart # 方式二jc 直接执行命令magic_commands 机制 $ jc needrestart -b方式二依赖解析器的magic_commands [needrestart -b]元数据jc 会代你执行needrestart -b并把 stdout 交给解析器。两种方式的最终 JSON 结构完全一致。配合常用参数查看效果$ needrestart -b | jc --needrestart -p输出 Schema 与示例处理后processed输出的 Schema 如下所有字段均来自文档声明{ version: string, running_kernel_version: string, expected_kernel_version: string, kernel_status: integer, container: string, session: [string], service: [string], pid: [string] }各字段与needrestart -b原始前缀的对应关系JSON 字段原始前缀含义versionNEEDRESTART-VERneedrestart 工具自身版本running_kernel_versionNEEDRESTART-KCUR当前运行内核版本expected_kernel_versionNEEDRESTART-KEXP已安装升级后内核版本kernel_statusNEEDRESTART-KSTA内核重启状态码整数0 表示无需重启非 0 表示需要处理containerNEEDRESTART-CONT检测到的容器环境如LXC web1sessionNEEDRESTART-SESS可多行建议重启的用户会话列表serviceNEEDRESTART-SVC可多行建议重启的 systemd 服务列表pidNEEDRESTART-PID可多行建议重启的进程进程名PID[,PID...]格式注意session/service/pid三个列表字段是条件性存在的只有当原始输出中出现对应行时才会出现在结果中见文档示例中就不含pid字段。文档示例处理模式-p美化打印$ needrestart -b | jc --needrestart -p { version: 2.1, running_kernel_version: 3.19.3-tl1, expected_kernel_version: 3.19.3-tl1, kernel_status: 1, container: LXC web1, session: [ metabase user manager service, root session #28017 ], service: [ systemd-journald.service, systemd-machined.service ] }raw 模式-r参数与键名规范化追加-r时jc 输出未经_process处理的原始结构化数据键名保留needrestart前缀且kernel_status未做类型转换$ needrestart -b | jc --needrestart -p -r { needrestart_ver: 2.1, needrestart_kcur: 3.19.3-tl1, needrestart_kexp: 3.19.3-tl1, needrestart_ksta: 1, needrestart_cont: LXC web1, needrestart_sess: [ metabase user manager service, root session #28017 ], needrestart_svc: [ systemd-journald.service, systemd-machined.service ] }从 raw 键名可以看出命名规则解析器先按行前缀拆分如NEEDRESTART-VER: 2.1再把键名规范化为小写下划线形式needrestart_ver由 jc/utils.py 中的normalize_key完成。-r模式适合调试或希望保留原始字段语义的脚本默认不传-r模式则由_process把键重命名为更简洁的 Schema 名称。源码实现解析解析器全部逻辑在 jc/parsers/needrestart.py 中结构简洁分为三层元数据info、主函数parse、后处理_process。parse按行前缀分类parse(data, rawFalse, quietFalse)先做平台兼容性与输入类型检查jc.utils.compatibility、jc.utils.input_type_check然后在有数据时逐行扫描按行首前缀分为五类单值行NEEDRESTART-VER、NEEDRESTART-KCUR、NEEDRESTART-KEXP、NEEDRESTART-KSTA、NEEDRESTART-CONT。用line.split(:, maxsplit1)拆出键值值strip()后写入raw_output。注意maxsplit1保证了值本身含冒号如时间戳类输出也不会被误切。多值行NEEDRESTART-SESS、NEEDRESTART-SVC、NEEDRESTART-PID各自累积到sess_list、svc_list、pid_list循环结束后若列表非空才写回raw_output对应needrestart_sess/needrestart_svc/needrestart_pid键——这就是上述条件性字段的来源。其他行直接忽略任何不以上述前缀开头的行包括 needrestart 自身的 Perl 告警行都不会进入结果。空输入时直接返回空字典raw_output {}配合jc.utils.has_data守卫不会抛异常。_process类型转换与键重命名_process维护一张固定映射表key_map把 raw 键改名为 Schema 键key_map { needrestart_ver: version, needrestart_kcur: running_kernel_version, needrestart_kexp: expected_kernel_version, needrestart_ksta: kernel_status, needrestart_svc: service, needrestart_cont: container, needrestart_sess: session, needrestart_pid: pid }同时特判needrestart_ksta通过jc.utils.convert_to_int把1转成整数1使kernel_status在 JSON 中是integer而非字符串。测试 tests/test_needrestart.py 中的run_all_fixtures会遍历所有 fixture 验证这一转换结果。测试 fixture 揭示的真实边界仓库提供了三组 fixture位于 tests/fixtures/generic/覆盖了文档示例之外的真实场景很有参考价值needrestart--standard.out与文档示例同构的完整输出VER/KCUR/KEXP/KSTA/CONT 2 行 SVC 2 行 SESS期望结果 needrestart--standard.json 中kernel_status为整数1验证了类型转换与键重命名。needrestart--pid.out只有NEEDRESTART-PID多值行的最小输出期望 needrestart--pid.json 只含version和pid两个字段其中 pid 元素保留进程名PID原样如dbus-daemon1754,2037——说明解析器对 pid 值只做整行收集不做二次拆分。needrestart--extralines.out最关键的健壮性样本。它包含文档 Schema 之外的NEEDRESTART-UCSTA、NEEDRESTART-UCCUR、NEEDRESTART-UCEXP行微码检查相关以及一行 Perl 告警Use of uninitialized value $uccode_vars{AVAIL} in concatenation (.) or string at /usr/sbin/needrestart line 904.期望输出 needrestart--extralines.json 只保留了 Schema 内的字段version、running_kernel_version、expected_kernel_version、kernel_status、service。可以确认未识别前缀的行与告警文本被安全丢弃解析器不会因发行版差异新增的行而报错也不会把未知字段混入结果。作为 Python 模块使用除 CLI 外文档声明的模块用法适用于自动化脚本import jc result jc.parse(needrestart, needrestart_command_output)参数与parse函数签名一致参数类型说明datastr待解析的文本即needrestart -b的完整 stdoutrawbool默认 False为 True 时返回未处理数据needrestart_*键名ksta为字符串quietbool默认 False为 True 时抑制警告信息返回值为字典processed或原始字典raw。典型场景在 Ansible/部署脚本里subprocess抓取needrestart -b输出后jc.parse然后判断result.get(kernel_status) ! 0或result.get(service)非空来触发重启提醒——相比 grep 原始文本JSON 判断天然免疫格式漂移。小结用法needrestart -b | jc --needrestart或jc needrestart -b仅支持 Linuxprocessed 输出 8 个 Schema 字段session/service/pid按原始输出出现与否条件存在kernel_status为整数-r输出needrestart_*前缀的 raw 键名其中ksta保持字符串源码按行前缀分类 → 条件性列表收集 → 键重命名 整数化三步实现未识别行含 UC* 微码字段与 Perl 告警被安全忽略行为由三组 generic fixture 锁定。赞分享开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载相关推荐jc lspci 解析器把 PCI 设备清单输出转换为结构化 JSON 的完整解析机制jc lspci 解析器把 PCI 设备清单输出转换为结构化 JSON 的完整解析机制 本文以 jc 仓库中的 lspci 解析器为核心完整讲解它支持的三种开发工具jc 的 lsblk 解析器把 Linux 块设备树输出转换为结构化 JSON 的完整指南jc 的 lsblk 解析器把 Linux 块设备树输出转换为结构化 JSON 的完整指南 本篇基于 jc 仓库的 lsblk 解析器文档 https://l开发工具zip.js Zip64深度解析突破4GB限制处理超大文件zip.js Zip64深度解析突破4GB限制处理超大文件 zip.js是一款功能强大的JavaScript库支持多核心压缩、压缩流、Zip64格式、分卷文上一篇如何用Kazumi打造你的个性化番剧收藏库从安装到自定义的完整指南下一篇如何用3步让2008年MacBook运行最新macOS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考