一、 Mac定时任务
Mac上常用的定时任务有cron和launchctrl两种方式。cron方式同Linux。本文重点讲述launchctrl方式。
launchctl 会根据 plist 配置文件信息来启动任务,常见的存放目录为:
- /Library/LaunchDaemons: 系统启动即会执行
- /Library/LaunchAgents: 用户登录后才会执行
完整的配置文件存放目录:
- ~/Library/LaunchAgents: 用户自己定义的任务项
- /Library/LaunchAgents: 管理员为用户定义的任务项
- /Library/LaunchDaemons: 管理员定义的守护进程任务项
- /System/Library/LaunchAgents: 由 macOS 为用户定义的任务项
- /System/Library/LaunchDaemons: 由 macOS 定义的守护进程任务项
一般情况下,在~/Library/LaunchAgents下使用即可,新建plist文件,文件名 com.corn.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>
<key>Label</key>
<string>com.corn.plist</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python</string>
<string>/Users/corn/test.py</string>
</array>
<key>StartInterval</key>
<integer>30</integer>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>StandardOutPath</key>
<string>/Users/corn/ttt.log</string>
<key>StandardErrorPath</key>
<string>/Users/corn/ttt.err</string>
</dict>
</plist>
plist 中支持两种执行时间的配置方式,可根据场景灵活选择:
- StartInterval: 指定脚本每间隔多久执行一次,单位:秒
- StartCalendarInterval: 指定脚本在具体时间执行,可包含的 key 如下
- Minute
- Hour (24-hour system)
- Day
- Weekday (0 and 7 are Sunday)
- Month
plist 常见参数说明
- Label: 需保证全局危矣
- Program: 要运行的程序
- ProgramArguments: 命令语句
- StartInterval: 时间间隔,与 StartCalendarInterval 使用其中一个
- StartCalendarInterval: 运行的时间,与 StartInterval 使用其中一个;单个时间点使用 dict,多个时间点使用 array<dict></dict>
- StandardInPath StandardOutPath StandardErrorPath: 日志文件
启动任务:
➜ LaunchAgents launchctl load com.corn.plist
➜ LaunchAgents launchctl start com.corn.plist
二、 向 IM 发送消息
取决于具体的IM对外提供的方式。一般原理上都是基于WebHook机制上,通过调用OpenApi接口,实现消息发送。
类似示例:
` curl -i -X POST -H ``'Content-Type: application/json'` ` -d ``'{ "tag": "text", "text": {"content": "Hello World!"}}'` `https:``//openapi.abc.com/webhook/group/xxxxxxxxxxxxxxxxxxxxxx` |
或用脚本文件封装,执行对应脚本即可。 如Python:
cmd = "curl -i -X POST -H 'Content-Type: application/json' -d '{\"tag\": \"text\", \"text\": {\"content\": \"Hello World!\"}}' 'https://openapi.abc.com/webhook/group/xxxxxxxxxxxxxxxxxxxxxx'"
check = commands.getoutput(cmd)
print check
三、注意事项
- 如果任务被修改了,那么必须先 unload,再重新 load。
- start 可用于测试任务,效果为立即执行,无论时间是否符合条件。
- 在执行 start 和 unload 前,任务必须先 load 过,否则报错。
- stop 可以停止任务。
- plist中的文件地址都必须是绝对路径(如~/xxx,这类路径是解析不成功的)。
- 脚本文件需要具有可读可写可执行权限(如权限不够,可以chmod 777 xx.py提升权限)。
- WeebHook调用一般都有次数限制,设置定时任务时需根据情况进行时间设置。
- plist配置是否正确,可以通过工具LaunchControl检测,方便且准确,可以第一时间发现问题。