我们一般查询到的MAC启动项是在 系统偏好设置->用户和组->启动项中进行修改,但是仍然会有一部分启动服务不在这里设置,要在Library下修改plist文件来修改,这篇博客就来介绍下MAC的启动项管理。
关闭自动启动的方法
先说结论,启动配置文件会放置在下面几个位置:
- 系统偏好设置->用户和组->启动项 (通过gui即可操作)
- /Library/LaunchAgents (用户登陆了才会执行,每个用户都适用的第三方代理)
- /Library/LaunchDaemons (系统启动了就会执行,第三方系统守护进程)
- /Library/StartupItems
- ~/Library/LaunchAgents (仅适用于登陆用户的第三方代理)
在上面的目录中找到对应的 plist 文件后,使用如下命令就可以取消开机自动启动:
- launchctl unload -w org.getlantern.plist (比如说要关闭lantern的自动启动,就可以找到名字里有lantern的文件关闭自启动)
启动文件的位置
关于这几个位置的详细介绍可以查看《终端使用手册》,在 Mac 上的“终端”中使用 launchd 管理脚本,这里引用一下:
macOS 使用 launchd
进程来管理守护进程和代理,而您还可以用它来运行 shell 脚本。您不与 launchd 直接交互,而是使用 launchctl 命令来载入或卸载 launchd
守护进程和代理。
在系统启动期间,launchd
是内核在设置电脑时首先运行的进程。若您想要 shell 脚本作为守护进程运行,应由 launchd
来启动它。其他用于启动守护进程和代理的机制可能会被 Apple 酌情移除。
您可以通过在以下文件夹中查看配置文件来了解由 launchd
管理的各种守护进程和代理:
下面给出了五个文件夹,其中 /System/目录下为系统文件不需要修改
关于lunchctl命令
launchctl remove
:从launchd
中异步删除任务,在返回之前它不会等待作业实际停止,因此不会对任何错误做处理launchctl unload
:停止并卸载任务,但该任务仍将在下次登录/重新启动时重新启动launchctl unload -w <路径>
:停止并卸载和禁用任务。该任务将不会在下次登录/重新启动时重新启动。
其他几个相关命令
launchctl stop
:停止任务。如果将任务已经是运行状态,则作业可能会立即重新启动。launchctl load <路径>
:只要未“禁用”该任务,就加载并启动任务。launchctl load -w <路径>
:加载并启动任务,同时还将任务标记为“未禁用”。任务将在下次登录/重新启动时重新启动。
关于plist文件
很多教程建议直接删掉plist文件,博主不建议这样做。我们先了解下 plist 是一个可以控制启动属性的xml文件(何时启动、什么条件触发启动、启动位置、启动流程、sleep、delay等很多参数都是通过plist文件来指定的),我们尽量保留plist文件以备后续适用。这里给一个plist文件的例子:
<?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> <!-- Label唯一的标识 --> <key>Label</key> <string>com.demo.plist</string> <!-- 指定要运行的脚本 --> <key>ProgramArguments</key> <array> <string>/Users/demo/run.sh</string> </array> <!-- 指定要运行的时间 --> <key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>00</integer> <key>Hour</key> <integer>22</integer> </dict> <!-- 标准输出文件 --> <key>StandardOutPath</key> <string>/Users/demo/run.log</string> <!-- 标准错误输出文件,错误日志 --> <key>StandardErrorPath</key> <string>/Users/demo/run.err</string> </dict> </plist>
我们使用launchctl来控制启动的常用命令有如下几个:
# 加载任务, -w选项会将plist文件中无效的key覆盖掉,建议加上 $ launchctl load -w com.demo.plist # 删除任务 $ launchctl unload -w com.demo.plist # 查看任务列表, 使用 grep '任务部分名字' 过滤 $ launchctl list | grep 'com.demo' # 开始任务 $ launchctl start com.demo.plist # 结束任务 $ launchctl stop com.demo.plist
更详细的介绍也可以参考:Mac中的定时任务神器launchctl
可以在终端运行 man launchd.plist 命令来查看启动帮助,也可以看到plist文件中字段的含义,注意到这里default字段是控制是否自动加载的,如果我们有进一步修改启动配置的需求可以参阅文档。
希望能有帮助,谢谢!