读:让 Emacs proced 在 macOS 上显示 CPU 和内存

💡 原文中文,约4300字,阅读约需11分钟。
📝

内容提要

本文讨论了如何在macOS上使用Emacs的proced.el显示CPU和内存信息。由于默认情况下proced不显示这些数据,作者提供了解决方案:通过异步运行ps命令获取进程信息,并将结果存入哈希表。接着,利用自定义属性将CPU和内存信息注入proced中,并定期刷新数据。文章还介绍了异步处理和正则表达式的Elisp编程技巧。

🎯

关键要点

  • Emacs内置的proced在macOS上无法显示CPU和内存占用,原因在于系统API未填充相关字段。

  • 解决方案是异步运行ps命令获取进程信息,并将结果存入哈希表,以PID为键。

  • 通过自定义属性将CPU和内存信息注入proced,并使用定时器每2秒刷新数据。

  • 使用make-process异步执行ps命令,确保输出格式不受用户locale影响。

  • 查询函数从哈希表中获取CPU和内存数据,使用cons结构存储以提高访问效率。

  • proced-custom-attributes用于将CPU和内存信息作为新列显示,确保在proced模式下运行时才刷新数据。

  • 在proced buffer关闭时取消定时器,以避免悬空的定时器。

  • 学习到的技巧包括使用lambda列表添加新列、异步执行外部命令的标准方式、周期性执行任务的便利性,以及检测当前buffer是否在TRAMP远程主机上的方法。

🔎

延伸解读

Emacs proced 的局限性

在 macOS 上,Emacs 的 proced 默认无法显示 CPU 和内存信息,这主要是由于系统 API 的限制。了解这一点有助于用户在使用 Emacs 进行进程监控时,意识到可能需要额外的配置和解决方案。

异步处理的优势

通过异步运行 ps 命令,用户可以在不阻塞 Emacs 的情况下获取进程信息。这种方法不仅提高了效率,还确保了数据的实时性,适合需要频繁监控系统资源的用户。

定时器的使用注意事项

在使用定时器刷新数据时,确保在 proced buffer 关闭时取消定时器,以避免资源浪费和潜在的错误。这一细节对于维护系统性能和稳定性至关重要。

延伸问答

如何在macOS上使用Emacs的proced显示CPU和内存信息?

可以通过异步运行ps命令获取进程信息,并将结果存入哈希表,然后利用自定义属性将CPU和内存信息注入proced中,定期刷新数据。

为什么Emacs的proced在macOS上无法显示CPU和内存占用?

因为Emacs的C层通过system_process_attributes函数获取进程属性时,未填充pcpu和pmem字段,导致这些数据为空。

如何使用Elisp编程技巧来处理异步进程?

可以使用make-process函数异步执行ps命令,并通过sentinel处理进程状态变化,确保在进程退出时获取完整输出。

在Emacs中如何定期刷新CPU和内存数据?

可以使用run-with-timer函数设置定时器,每2秒刷新一次哈希表中的数据。

为什么选择使用哈希表而不是列表来存储进程信息?

因为哈希表的查找时间是O(1),即使有几百个进程也能快速访问,而列表的查找时间较长。

如何在proced模式下添加新的CPU和内存列?

通过proced-custom-attributes定义lambda函数,将CPU和内存信息作为新列显示,并在proced模式下运行时刷新数据。

🏷️

标签

➡️

继续阅读