爱意满满的作品展示区。
mahui

做了个 macOS 菜单栏小工具 Pier — 看端口、进程、系统状态,一键杀进程

  •  
  •   mahui · 1 day ago · 931 views

    Pier — 菜单栏查看进程端口小工具

    折腾了一段时间,做了个 macOS 菜单栏小工具 Pier,今天来 V2EX 露个面,顺便求点反馈。

    官网: https://pier.app.mahui.me 现在是推广期,全功能免费,下载即用,无需付费/注册。


    为什么做这个

    平时开发经常遇到几个特蠢的问题:

    • 端口被占了,要开终端 lsof -iTCP -sTCP:LISTEN -nP 一顿敲,看到 PID 再去 kill ;
    • 想重启个 Docker 容器或者 brew 服务,又得切到终端。

    市面上能干这事的工具不是 Electron 套壳吃内存,就是订阅制按月收钱。所以我自己写了一个:

    • 原生 SwiftUI + MenuBarExtra,空闲 CPU 趋近于 0 ;
    • 常驻菜单栏,不占 Dock ;
    • 看 + 操作合一,结束进程 / 启停服务全部在弹窗里搞定。

    四个面板

    1. 端口 — 看谁在监听

    端口

    所有 TCP / UDP 监听端口、占用它的进程、App 图标、绑定地址、IPv4·IPv6 标签。对外暴露的端口会有提醒,一键 kill 。

    2. 进程 — 揪出占用大户

    进程

    按 CPU / 内存实时排序,带 App 名和图标。展开看完整命令行、路径、父进程。结束或强制结束。系统进程会加保护提示。

    3. 系统 — 一眼看清状态

    系统

    CPU 、内存、Swap 、磁盘、实时网速。可以把某个数字(比如网速)直接钉到菜单栏图标旁,连窗口都不用开。

    4. 开发工具 — 告别终端

    开发

    Docker / Podman 容器、Homebrew services 直接启停。还会识别你的 docker 命令其实是不是 Podman 。


    安装

    直接下 DMG: https://pier.app.mahui.me

    或者 Homebrew:

    brew install --cask mahui/tap/pier
    
    要求 macOS 14 ( Sonoma )+,Apple Silicon / Intel 都支持。
    

    求反馈

    • 端口/进程/系统/开发工具,还有哪些场景是你每天都遇到、但目前没好工具的?
    • 菜单栏读数想看到什么指标?
    • Bug 或体验问题欢迎在评论里拍砖,或者发到 [email protected]

    谢谢围观 🍻

    Supplement 1  ·  5h 32m ago

    Pier 菜单栏读数

    今天发了 1.2 系列。

    这次的新功能

    1. 菜单栏可以同时挂 CPU / 内存 / 网络 三个指标

    之前只能挂一个。现在偏好里三个独立 checkbox,菜单栏形如 [icon] CPU17% MEM69% ↓512B ↑0B,每段实时刷新。

    Pier 偏好窗口

    2. 进程列表加了「网速」排序

    按上下行速率倒序,每行右侧 ↓X.XKB ↑Y.YKB,跟 CPU / 内存 并排。等价于 Activity Monitor 的网络标签,但在菜单栏一键就能打开看。

    进程「网络」排序

    中间踩了个坑

    per-process 网速最朴素的实现是 fork 一个 nettop 子进程读它的 CSV 输出。我先是这么干的——直到发现 nettop -L 0(logging mode, infinite samples)有一个 spin-loop bug,持续占满 ~1.4 个核:

    PID    COMMAND   %CPU
    xxxxx  nettop    141.2
    

    -c (gentle on CPU) 和 -s 5 (拉长间隔) 都压不住,nettop 内部 tight loop 不受这些参数控制。

    最后换思路:dlopen macOS 私有 framework NetworkStatistics.framework——这是 nettop 内部本来就在用的同一套内核 API,Activity Monitor / LuLu / Stats / Little Snitch 也都基于它。绕过 nettop 直接订阅 socket-level rxBytes/txBytes 后,闲时 CPU 回到 0,看「网络」排序时 Pier 自身也 < 1%。

    途中还碰到一个 Swift 的小坑:用 pty 让 nettop 行缓冲时(pipe 是块缓冲,会让 nettop 攒 30s 才 flush 一批),输出行尾是 \r\n,但 Swift 把 CRLF 视为单个 grapheme cluster Character,firstIndex(of: "\n") 直接找不到——得用 isNewline。这种细节不撞一次没法知道。

    VPN 场景的妥协

    macOS 内核不维护 packet → process 的关联——所有用户态 API(NStat / sysctl / netstat / IORegistry)都是基于 BSD socket 层。VPN tunnel 加密后的字节归到 VPN 进程,应用进程(比如 Chrome 看 YouTube)只看到与 tunnel device 通信的小流量。

    这是 Activity Monitor / nettop 共有的行为,不是 Pier 的实现问题。但容易让用户困惑,所以 Pier 在检测到 utun / ppp / ipsec 等接口有显著流量时,会在「网络」排序面板顶部加一条提示条(上面那张图能看到顶部那条橙色 banner)。

    下载

    推广期全功能免费,原生 SwiftUI,中英双语 + 浅深色主题,macOS 14+。

    16 replies    2026-06-04 14:39:03 +08:00
    ahu
        1
    ahu  
       1 day ago
    装了,先用起再看
    SenLief
        2
    SenLief  
       1 day ago
    不错,不错,已经用起来了,打折促销一下。
    mahui
        3
    mahui  
    OP
       1 day ago
    @SenLief 之前想过收费。但不知道定多少合适?🤣
    mahui
        4
    mahui  
    OP
       1 day ago
    @ahu 有问题随时提。🤝
    ahu
        5
    ahu  
       1 day ago
    @mahui #4 😄 问题来了!准确说是建议:

    开发者里列出了 Brew 的服务,然后每项服务后有个“启动”按钮。我觉得是不是结合进程显示一下服务的实际启动状态?如果已启动的,就别再显示“启动”按钮了,可以显示“停止”按钮或重启什么的吧?
    mahui
        6
    mahui  
    OP
       1 day ago
    @ahu 感谢反馈。我刚刚看了下,这个状态与 brew service list 的状态是保持一致的。如果已经启动的,显示的就是重启和停止按钮
    qfdk
        7
    qfdk  
    PRO
       1 day ago
    端口/进程/系统/开发工具,还有哪些场景是你每天都遇到、但目前没好工具的?

    - 看起来跟 portkill 一样,那个可以 kill 端口,甚至还能搞 cf 隧道. 纯看端口 跟 CPU 感觉用处不大
    - https://github.com/productdevbook/port-killer
    mahui
        8
    mahui  
    OP
       1 day ago
    @qfdk 定位不同。我是一个经常多项目并行开发的全栈工程师,3000/8080/9000 等这些端口冲突是常见的问题,也正是这个常见问题产生了做这个项目的想法。至于 UDP/IPv4/v6/本地回环/LAN 以及其它 CPU/内存/System/Dev 的都是后面想到加的。简单易用的监控,以及顺手的管理,是这个 app 的定位。
    端口转发,tunnel 这些如果我做的话大概会定义为另一个工具。
    linqiu919
        9
    linqiu919  
       17h 39m ago
    安装了,挺好用的,很轻量,但是这个图片怎么比别的图标大了一圈 ,我是 15.2 的系统,另外软件里的邮件按钮点击跳转 404 了,可以考虑收费的,定价不高的话我还是很愿意支持的。
    mahui
        10
    mahui  
    OP
       16h 37m ago
    @linqiu919 感谢支持。
    1.图标问题:由于手头没有 15.2 的系统,查了下 apple HIG ,尝试修复一版,可以更新看看。
    2.邮件问题:本身按钮是 mailto: 协议的链接,如果机器上没有默认 mail 客户端,会 fallback 到浏览器,浏览器解析不出来或者用户的 mailto handler 是 webmail 把地址塞进了 URL → 404 。已经调整了交互,点击后不会直接 mailto ,可以复制邮箱,或者打开 mail 。

    ![]( )

    可以在设置里检查更新,或者用 homebrew 更新:brew upgrade --cask pier
    fengci
        11
    fengci  
       16h 36m ago
    实际不支持 intel 芯片啊 。
    mahui
        12
    mahui  
    OP
       16h 22m ago
    @fengci 不好意思,前面 build 漏了 x86_64 arch 。再安装试下。
    linqiu919
        13
    linqiu919  
       15h 34m ago
    @mahui #10 更新了最新版,还是大一点,不过无伤大雅了,一般也不去看图标
    mahui
        14
    mahui  
    OP
       15h 29m ago
    @linqiu919 理解万岁。后面有机会了我还是找个老版本的机器再看看。
    hr6r
        15
    hr6r  
       12h 12m ago
    好用
    menubar show next to icon 可以多加几个就好了 cpu mem network...
    另外能不能加个 network ,每个 process 的网络情况
    可以替代 stats 了
    mahui
        16
    mahui  
    OP
       12h 4m ago via iPhone
    @hr6r 感谢反馈。已加入开发计划。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1040 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 18:43 · PVG 02:43 · LAX 11:43 · JFK 14:43
    ♥ Do have faith in what you're doing.