launchctl 是一个统一的服务管理框架,可以启动、停止和管理守护进程、应用程序、进程和脚本等。
- 创建管理守护进程
- 定时任务脚本 ( 类似 crontab )
launchctl 配置文件后缀为 .plist
, 一般存储于
位置 | 备注 |
---|---|
$HOME/Library/LaunchAgents | 由用户自己定义的任务项 |
/Library/LaunchAgents | 由管理员为用户定义的任务项 |
/Library/LaunchDaemons | 由管理员定义的守护进程任务项 |
/System/Library/LaunchAgents | 由OSX为用户定义的任务项 |
/System/Library/LaunchDaemons | 由OSX定义的守护进程任务项 |
- LaunchDaemons 一般为守护进程配置,多数用于系统启动运行
- LaunchAgents 一般为用户脚本以及需要登录用户后才会执行的进程
DEMO
plist 典型的 xml 文件语法配置,内部按照需要的部分进行配置。
<?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为健值,跟string为字符串类型的值 -->
<key>Label</key>
<string>com.demo.plist</string>
<!-- 指定要运行的可执行文件 -->
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/cli</string>
<string> -c </string>
<!-- flag 参数可以继续添加 -->
</array>
<!-- 自动执行, 如果定时不需要此项 -->
<key>RunAtLoad</key>
<true/>
<!-- 守护进程,保持运行 -->
<key>KeepAlive</key>
<true/>
<!-- 指定要运行的时间 -->
<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>
节点
- plist
- dict
- key: string
- valueType: array|dict|string|integer
- dict
key (健)一般为 string, key是 launch 定义的内容。
紧跟 key 后的为 以类型为定义的标签表示 key 的值。
KEY
健 | 值 | 备注 |
---|---|---|
Label | string | 唯一标识, 显示于 launchctl list 中 |
ProgramArguments | array[string] | 执行脚本, 值为string参数 |
RunAtLoad | true/false | 自动执行,按照plist所在位置来执行 |
KeepAlive | true/false | 守护进程 |
StandardOutPath | string | 输出日志 |
StandardErrorPath | string | 错误日志 |
StartCalendarInterval | dict | 定时执行,类似 crontab |
StartInterval | dict | 间隔单位执行 |
Minute | integer | 分 |
Hour | integer | 时 |
Day | integer | 日 |
Weekday | integer | 周 0-6 0和7 均是周日 |
Month | integer | 月 |
launchctl 常用命令
launchctl load -w labelName
加载任务, -w选项会将plist文件中无效的key覆盖旧launchctl unload -w labelName
卸载任务launchctl list
任务列表launchctl start labelName
开始任务launchctl stop labelName
结束任务
案例
自动启动 Aria 下载服务, 文件 ~/Library/LaunchAgents/com.aira2.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>
<key>Label</key>
<string>com.aria2</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/aria2c</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
加载 , 执行, 查询进程
launchctl load -w com.aria2
launchctl start com.aria2
ps aux|grep aria2c