macOS系统的自启动项分为不同的用户级别,不同用户级别的自启动项的表现方式也不同。
1. 普通用户级别,配置为普通用户级别的启动项在用户登录完成之后启动,比如我们在“系统->设置->登录项”配置的自启动程序;
2. root用户级别,root用户级别的启动项面向所有的用户,可以在开机完成之后就启动,无需普通用户登录完成;
3. 系统级别,系统级别的自启动项无法进行修改,主要由系统内核进行管理;
macOS系统目前主要通过Launchd来进行启动项管理,Launchd是系统启动的第一个进程,其PID为1,主要用于管理后台程序、应用和脚本的运行。
1. Launchd启动之后会先扫描目录“/System/Library/LaunchDaemons”和“/Library/LaunchDaemons”下的plist文件并进行加载。
2. 用户完成登录操作之后,Launchd会扫描目录“/System/Library/LaunchAgents”、“/Library/LaunchAgents”、“~/Library/LaunchAgents”下的plist文件并进行加载。
Launchd加载plist文件会检查“RunAtLoad”和“KeepAlive”配置,只有其中一个为YES的情况才会启动对应的任务。
Deamons和Agents
Deamons和Agents的主要区别是所属用户不同。Agent是以当前用户权限执行(普通用户),而Daemon则是以root用户权限执行(所以Daemon对应的执行文件的owner必须配置为root)。
配置文件
配置文件以.plist结尾,实际结构为xml结构,以如下的plist文件为示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.ctyun.control</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/control</string>
<string>-p</string>
<string>7777</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardErrorPath</key>
<string>/var/log/com.ctyun.control.log</string>
<key>StandarOutPath</key>
<string>/var/log/com.ctyun.control.log</string>
</dict>
</plist>
1. Label是为启动的程序设置一个唯一的标签;
2. ProgramArguments设置程序的启动参数,值为数组类型,可以直接把第一个参数配置为程序路径(也可以单独使用Program来配置程序路径);
3. RunAtLoad为是否加载即启动程序,如果false则需要主动启动程序;
4. KeepAlive为是否需要保活,如果为true,则Launcd检测到程序退出会再次启动;
5. StandardErrorPath和StandardOutPath配置日志输出目录,方便进行调试,NSLog的输出会打印到对应的日志文件;
launchctl
launchctl是用来管理启动项plist的工具
1. 查看所有由launchd管理的启动项进程:
launchctl list
2. 加载plist配置文件:
launchctl load -w /Library/LaunchDaemons/com.ctyun.control.plist
“-w”为可选项,表示是否立即启动程序。
需要注意,如果是LaunchAgents目录则plist文件owner为当前用户即可,如果是LaunchDaemons则需要修改文件owner为root用户:
sudo chown root com.ctyun.control.plist
3. 取消plist配置:
launchctl unload /Library/LaunchDaemons/com.ctyun.control.plist