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

key (健)一般为 string, key是 launch 定义的内容。
紧跟 key 后的为 以类型为定义的标签表示 key 的值。

KEY

备注
Labelstring唯一标识, 显示于 launchctl list 中
ProgramArgumentsarray[string]执行脚本, 值为string参数
RunAtLoadtrue/false自动执行,按照plist所在位置来执行
KeepAlivetrue/false守护进程
StandardOutPathstring输出日志
StandardErrorPathstring错误日志
StartCalendarIntervaldict定时执行,类似 crontab
StartIntervaldict间隔单位执行
Minuteinteger
Hourinteger
Dayinteger
Weekdayinteger周 0-6 0和7 均是周日
Monthinteger

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