在 macOS 中,许多程序(包括系统服务、第三方软件和恶意软件)都需要在后台长期运行。为了实现「持久化启动」,macOS 提供了统一的机制 —— launchd 启动管理器。
后台启动项配置文件就是由 launchd 读取的属性列表(.plist)文件,用来告诉系统要运行哪个程序、在什么时机运行、是否常驻。
启动项的类型
1、LaunchAgents
1、位置:
/System/Library/LaunchAgents/(系统自带)
/Library/LaunchAgents/(全局第三方软件)
~/Library/LaunchAgents/(仅当前用户)
2、启动时机:用户登录时加载。
3、运行环境:用户会话环境,可以访问 GUI(如菜单栏、弹窗)。
4、常见用途:云盘同步客户端(Dropbox Helper)、输入法、菜单栏工具。
2、LaunchDaemons
1、位置:
/System/Library/LaunchDaemons/(系统自带)
/Library/LaunchDaemons/(全局第三方软件)
2、启动时机:系统开机时即加载,不依赖用户登录。
3、运行环境:系统后台,通常以 root 权限运行,无法直接显示 UI。
4、常见用途:驱动程序、VPN 服务、数据库服务(MySQL、PostgreSQL)、杀毒软件守护进程。
Agents和Daemon区别
1、Agents:在用户登录时才会加载,必须有用户会话(GUI桌面环境)才能运行。
2、Daemons:在系统启动时就会加载,不依赖用户是否登陆,可以在登陆界面之前运行。
对比总结
1、/System/Library/LaunchAgents:系统自带的用户级服务,macOS资源,不要动;
2、/System/Library/LaunchDaemons:系统自带的全局后台服务,macOS资源,
不要动;
3、/Library/LaunchAgents:全局第三方用户级服务,例如微信、QQ、杀毒软件等,可清理;
4、/Library/LaunchDaemons:全局第三方后台服务,例如Docker、数据库、驱动等,可清理;
5、~/Library/LaunchAgents:当前用户的第三方服务,例如Dropbox、输入法等,可清理。
配置文件结构(示例)
一个典型的 .plist 文件如下(以 Docker 网络服务为例):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.docker.vmnetd</string>
<key>ProgramArguments</key>
<array>
<string>/Library/PrivilegedHelperTools/com.docker.vmnetd</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>Sockets</key>
<dict>
<key>Listener</key>
<dict>
<key>SockPathName</key>
<string>/var/run/com.docker.vmnetd.sock</string>
</dict>
</dict>
</dict>
</plist>
关键字段
1、Label:任务的唯一标识或称
2、Program / ProgramArguments:要运行的可执行文件及参数,例如这里执行的程序路径:
/Library/PrivilegedHelperTools/com.docker.vmnetd
3、RunAtLoad:是否在加载时立即运行。这里表示一旦用户登陆,就立即运行这个程序。
4、KeepAlive:是否保持常驻(崩溃后自动重启)。
5、Sockets / WatchPaths / StartInterval:触发条件(监听端口、目录变化、定时任务)。
「登录项」
登录项(Login Items):用户在「设置 –> 通用 -> 登录项与扩展」里能看到。

一般是完整的应用程序(如微信、QQ、Chrome)。
安全风险
1、正常用途:应用自启、驱动加载、服务守护。
2、恶意用途:黑客或木马会写入一个 LaunchAgent/Daemon,让恶意程序在开机或登录时自动运行,从而实现持久化驻留。
3、判断标准:
文件名是否正规(如 com.microsoft.update.agent.plist 属于微软)。
程序路径是否可信(如 /Library/Application Support/… 里陌生的可执行文件就值得警惕)。
是否有数字签名(用 codesign -dv 检查)。
管理方法
1、查看当前启动项
launchctl list
这个命令会列出当前系统由launchd管理的所有job(任务)。
这些job可能来自:
配置文件(,plist),如/Library/LaunchAgents/、/Library/LaunchDaemons/、~/Library/LaunchAgents/ 等目录加载的。
App 运行时动态注册的 job:有些 App 会在启动时直接调用 API 注册后台任务,不一定会留下 .plist 文件。
launchctl list 显示的是“已经在运行或注册中的任务”,而不仅仅是“硬盘上有配置文件的启动项”。
2、卸载某个启动项
sudo launchctl bootout system /Library/LaunchDaemons/com.xxx.plist
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.xxx.plist
launchctl bootout:停止并卸载一个已经加载到内存的任务(job),但它并不会删除硬盘上的 .plist 文件。
system指的是系统级 domain(root/所有用户),对应 LaunchDaemons。
gui/$(id -u) 指的是当前用户的 GUI 会话 domain(登录桌面之后的环境),对应 LaunchAgents。
举例:
/Library/LaunchDaemons/com.xxx.plist,表示系统开机时加载的后台守护进程,需要 sudo 停止。
~/Library/LaunchAgents/com.xxx.plist,表示只对当前用户生效的登录启动项,可以不用 sudo。
这两行命令的作用是:
第一行:停止一个全局的后台服务(Daemon)。
第二行:停止一个当前用户的后台代理(Agent)。
如果 .plist 文件还在的话,下次开机/登陆会重新加载。
3、结束进程+卸载进程
launchctl bootout可以卸载进程,kill命令也可以卸载进程。
先杀死进程:
ps aux | grep weixin
kill -9 <进程号>
卸载应用和残留文件:
rm -rf ~/Library/Application\ Support/WeChat
rm -rf ~/Library/Preferences/com.WeChat*
rm -rf ~/Library/Caches/com.WeChat*
4、彻底禁用
停止运行的job:
sudo launchctl bootout system /Library/LaunchDaemons/com.xxx.plist
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.xxx.plist
删除对应的 .plist 文件(建议先备份)。
sudo rm -f /Library/LaunchDaemons/com.xxx.plist
rm -f ~/Library/LaunchAgents/com.xxx.plist
重启系统,确保不会被重新加载。
再次检查:
launchctl list | grep com.xxx
总结
LaunchAgents:随用户登录启动,能显示 UI。
LaunchDaemons:随系统启动加载,后台运行,无 UI。
Login Items:用户可见的图形化登录启动项。
launchctl bootout = 停掉已经运行的任务(job)。
.plist 文件 = 定义启动项的配置,存放在不同目录。
系统的 /System/Library/… 路径是 macOS 内建服务,不要清理。
第三方软件的启动项主要在 /Library/… 和 ~/Library/…,清理它们才是安全的。
扩展知识
其他启动项
1、Shell配置文件里的启动项
~/.zshrc、~/.bash_profile、~/.zprofile、~/.profile
如果有人在这里偷偷加了 curl … | sh 或 launchctl load 之类的命令,每次打开终端都会运行。
2、StartupItems(旧机制)
/Library/StartupItems/
~/Library/StartupItems/
macOS 10.10 之后基本废弃,但老旧软件(或盗版软件)可能还会写这里。
3、内核扩展(驱动类启动项)
/Library/Extensions/
/System/Library/Extensions/
驱动层面的“启动项”,随系统启动而加载,风险更高。
木马进程
如果电脑安装过盗版软件,就需要检查系统里有没有莫名其妙(可能是木马)的守护进程:
1、/Library/LaunchAgents
2、 /Library/LaunchDaemons
3、~/Library/LaunchAgents/
或者登陆项。
如果有的话,参考前面的方法,先禁用再删除(记得备份),重启电脑检查是否彻底删除。