Bollard

把启动项收进菜单栏

Bollard 列出 ~/Library/LaunchAgents 下的每一个启动项。哪些已经加载、哪个有进程在跑,一眼看清;拨一下开关就加载或卸载,没有主窗口。

macOS 11+ · Intel / Apple 芯片 · 不到 1 MB

Bollard 的全部界面就是这个菜单(示意,启动项是示例)。拨一拨开关试试,顶上的数字会跟着变。

功能

一眼看清
每个启动项一行:开关开着就是已加载进 launchd,有进程在跑的显示 pid。已加载的排在前面。
拨一下就生效
加载或卸载后菜单不收起,做完当场回显真实状态;没成功就把 launchctl 的原话弹给你。
随开随新
每次打开菜单都重新读取,不会显示过期的状态。
认得「已停用」
被 launchctl disable 停用的启动项单独标出。拨开它的开关,会先解除停用再加载。
好读的名字
难认的 Label 可以在 settings.json 里配一个自己看得懂的名字。
中英文界面
跟随系统语言,中文以外的系统显示英文;也可以在菜单里指定。
自动更新
后台检查并下载新版本,校验通过后等你点安装。

原理

Bollard 自己不启动、也不看管任何进程。它只是 macOS 自带的 launchd 的一个遥控器:读 launchd 的状态画成菜单,拨开关时替你敲一条 launchctl 命令。

启动项是什么
launchd 是 macOS 负责拉起并看管后台服务的进程。~/Library/LaunchAgents 里的每个 plist 描述一个服务;登录时 launchd 把这个目录扫一遍,逐个加载。Bollard 只管这一个目录,所以不需要管理员密码。
三层状态
plist 在不在目录里,决定下次登录加不加载;已加载还是未加载,是 launchd 现在认不认识它,只在本次登录期间有效;已停用是记在 launchd 里的一个标记,带着它加载会被拒绝,重启后仍然有效。
列表怎么来的
每次打开菜单:列出目录里的 plist 读出 Label,再用 launchctl list 查哪些已加载、pid 是多少,用 launchctl print-disabled 查哪些被停用,按 Label 对上。不常驻轮询。
拨开关
开是 launchctl bootstrap(已停用的先 launchctl enable),关是 launchctl bootout。launchctl 的退出码不可靠,所以成不成功以事后查到的实际状态为准。
开着却没有 pid
有的启动项就是服务本身,比如 redis:显示 pid,关掉服务就停。有的只是触发器,比如某个应用的「登录时启动」:登录时跑一下 open 把应用叫起来就退出,所以开着却没有 pid;关掉它应用不会退出,只是下次登录不再自启。

安装

在终端里执行这两行。这样装好的 Bollard 可以直接打开。

$ curl -fL https://bollard.tianyw0.xyz/Bollard.zip \
    -o ~/Downloads/Bollard.zip
$ unzip -o ~/Downloads/Bollard.zip -d /Applications

Bollard 只做了 ad-hoc 签名,没有经过 Apple 公证。用浏览器下载的话,第一次打开会被系统拦下,需要到「系统设置 → 隐私与安全性」里点「仍要打开」。

卸载一个启动项只在本次登录期间有效:plist 还在 LaunchAgents 里,下次登录系统会照常加载它。

规格

当前版本
读取中
系统
macOS 11 及以上
芯片
Intel 与 Apple 芯片通用,一个安装包
管理范围
当前用户的 ~/Library/LaunchAgents
生效方式
launchctl bootstrap / bootout,不需要管理员密码
签名
ad-hoc,未公证
SHA-256
读取中