好久没有花1个小时以上来调查一个技术问题了。。。而且2022年一篇博客都没有写。

想在Mac设置个计划任务,定时执行我的一个python脚本。

首先想到的是crontab,但是说已不建议使用,但还是倔强试了试。没有成功。过了几天确实需要这个定时任务,所以改用launchctl,结果我的脚本就是不能执行。

搜索了好久,问题才解决。下面记录下用launchctl做计划任务的过程。

1. 准备要定期执行的脚本

#!/bin/sh
echo `date +"%Y-%m-%d %H:%M:%S"`
set -x
cd /Users/yan/Documents/ZohoRepository
/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 mygit.py my mail

修改脚本权限: chmod 777 mygit.sh

2. 准备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.mygit.plist</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Users/username/Documents/ZohoRepository/mygit.sh</string>
  </array>
  <key>StartCalendarInterval</key>
  <array>
  <dict>
        <key>Minute</key>
        <integer>16</integer>
        <key>Hour</key>
        <integer>9</integer>
        <key>Weekday</key> 
        <integer>1</integer>     
  </dict>
  <dict>
        <key>Minute</key>
        <integer>16</integer>
        <key>Hour</key>
        <integer>9</integer>
        <key>Weekday</key> 
        <integer>2</integer>     
  </dict>
  <dict>
        <key>Minute</key>
        <integer>16</integer>
        <key>Hour</key>
        <integer>9</integer>
        <key>Weekday</key> 
        <integer>3</integer>     
  </dict>
  <dict>
        <key>Minute</key>
        <integer>16</integer>
        <key>Hour</key>
        <integer>9</integer>
        <key>Weekday</key> 
        <integer>4</integer>     
  </dict>
  <dict>
        <key>Minute</key>
        <integer>16</integer>
        <key>Hour</key>
        <integer>9</integer>
        <key>Weekday</key> 
        <integer>5</integer>     
  </dict>
    </array>
<key>StandardOutPath</key>
<string>/Users/username/Documents/ZohoRepository/run.log</string>
<key>StandardErrorPath</key>
<string>/Users/username/Documents/ZohoRepository/run.err</string>
</dict>
</plist>

保存为com.mygit.plist文件,复制到/Library/LaunchAgents文件夹

3. 添加为服务

转到/Library/LaunchAgents目录,执行命令:

launchctl load -w com.mygit.plist

这个时候应该就会执行了(launchctl start)。但是我的脚本出现问题,在run.err日志:

/bin/sh: /Users/username/Documents/ZohoRepository/mygit.sh: Operation not permitted

这里花费了好多时间来找解决方法:

在Mac的设置(13.01 版本) - 隐私与安全性 - 完全磁盘访问权限, 添加/bin下的bash或sh

故障排查工具

plist文件检查:plutil

launchcontrol:launchctl的图形工具 - 可以编辑plist文件、查看错误、查看日志等等

参考

下面几个网页比较有参考价值:

  • https://zhuanlan.zhihu.com/p/388287366

  • https://www.kith.org/jed/2022/02/15/launchctl-scheduling-shell-scripts-on-macos-and-full-disk-access/