管理MAC系统启动项

我们一般查询到的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字段是控制是否自动加载的,如果我们有进一步修改启动配置的需求可以参阅文档。

希望能有帮助,谢谢!

发表评论