Skip to content

macOS虽然支持cron,但是不推荐。

launchctl

launchd 不能直接用户执行,需要借助 #launchctl 来管理

Bash
launchctl bootstrap|bootout gui/$(id -u) ~/Library/LaunchAgents/my_script.plist
# launchctl bootstrap background my_script.plist

launchctl enable|disable gui/$(id -u)/my_script

launchctl start|stop my_script

# 校验配置
plutil -lint ~/Library/LaunchAgents/my_script.plist

# 查看日志
log show --predicate 'eventMessage contains "com.example.myservice"' --info

plist

*.plist 是任务定义文件, #xml 格式,放置路径 • ~/Library/LaunchAgents/ 当前用户 • /Library/LaunchAgents/ 所有用户(root) • /Library/LaunchDaemons/ 系统范围加载的后台任务(root)

GPT

服务基本信息

Label

• 唯一标识服务的名称。 • 示例:

XML
<key>Label</key>
<string>com.example.myservice</string>

Program

• 指定执行的二进制文件路径。 • 示例:

XML
<key>Program</key>
<string>/usr/bin/python3</string>

ProgramArguments

• 指定执行的命令及其参数(替代 Program)。 • 类型:` • 示例:

XML
1
2
3
4
5
6
<key>ProgramArguments</key>
<array>
    <string>/usr/bin/python3</string>
    <string>/path/to/script.py</string>
    <string>--arg1</string>
</array>

服务运行配置

RunAtLoad

• 服务是否在 launchctl load 或系统启动时运行。 • 类型:<boolean> • 示例:

XML
<key>RunAtLoad</key>
<true/>

KeepAlive

• 是否在服务退出后自动重启。 • 类型:<boolean><dict> • 示例(简单重启):

XML
<key>KeepAlive</key>
<true/>

• 示例(条件重启):

XML
1
2
3
4
5
<key>KeepAlive</key>
<dict>
    <key>SuccessfulExit</key>
    <false/>
</dict>

WorkingDirectory

• 设置服务的工作目录。 • 示例:

XML
<key>WorkingDirectory</key>
<string>/path/to/working/directory</string>

服务启动条件

StartInterval

• 指定服务每隔多少秒启动一次。 • 类型:<integer> • 示例:

XML
<key>StartInterval</key>
<integer>3600</integer>

StartCalendarInterval

• 指定服务的启动时间(定时任务)。 • 类型:<dict><array>(多时间点) • 示例(每天凌晨 3:30):

XML
1
2
3
4
5
6
7
<key>StartCalendarInterval</key>
<dict>
    <key>Hour</key>
    <integer>3</integer>
    <key>Minute</key>
    <integer>30</integer>
</dict>

环境变量

EnvironmentVariables

• 指定服务运行时的环境变量。 • 类型:<dict> • 示例:

XML
1
2
3
4
5
6
7
<key>EnvironmentVariables</key>
<dict>
    <key>PATH</key>
    <string>/usr/local/bin:/usr/bin:/bin</string>
    <key>MY_VAR</key>
    <string>some_value</string>
</dict>

日志与输出

StandardOutPath

• 标准输出的日志路径。 • 示例:

XML
<key>StandardOutPath</key>
<string>/path/to/output.log</string>

StandardErrorPath

• 标准错误的日志路径。 • 示例:

XML
<key>StandardErrorPath</key>
<string>/path/to/error.log</string>

权限与用户

UserName

• 指定服务以哪个用户身份运行。 • 示例:

XML
<key>UserName</key>
<string>nobody</string>

GroupName

• 指定服务以哪个用户组身份运行。 • 示例:

XML
<key>GroupName</key>
<string>staff</string>

一个样例,可以和rclone末的shell配合

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>
    <key>Label</key>
    <string>icu.blackshop.rclone.sync.onedrive.e2ee</string>
    <key>ProgramArguments</key>
    <array>
      <string>/bin/zsh</string>
      <string>-c</string>
      <string>source ~/.config/zsh/custom/rclone.zsh &amp;&amp; e2ee_sync</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/Users/xxx</string>
    <key>RunAtLoad</key>
    <true />
    <key>KeepAlive</key>
    <dict>
      <key>SuccessfulExit</key>
      <false />
    </dict>
    <key>StartInterval</key>
    <integer>3600</integer>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/opt/local/bin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/tmp/rclone_sync.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/rclone_error.log</string>
  </dict>
</plist>