Mac定时任务向IM发送消息

509 阅读2分钟

一、 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检测,方便且准确,可以第一时间发现问题。