老青菜

Mac launchctl crontab

2016-09-18

最近在研究客户端持续集成,有个需求是每天固定时间点自动打包,说到定时任务,常用的有两种:

  • 使用 crontab 命令来添加定时任务,适用于linux、mac
  • 使用 launchctl 配置文件来添加定时任务,适用于mac

crontab命令

通过 crontab 命令,我们可以在固定的间隔时间执行指定shell脚本,时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。

命令格式

 crontab [-u user] file
 crontab [-u user] [ -e | -l | -r ]

参数

-u user:用来设定某个用户的crontab服务
-file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件

-i:在删除用户的crontab文件时给确认提示

crontab文件格式

分 时 日 月 周 command

#分钟:1~59
#小时:1~23(0表示子夜)
#日:1~31
#月:1~12
#周:0~7(0和7表示周日)
#command:要运行的命令

Demo

# 每1分钟执行一次
* * * * * echo $PWD >> ~/log.txt

# 每小时的第2和第32分钟执行
2,32 * * * * echo $PWD >> ~/log.txt

# 在上午8点到12点的第2和第32分钟执行
2,32 8-12 * * * echo $PWD >> ~/log.txt

# 每隔两天的上午8点到12点的第2和第32分钟执行
2,32 8-12 */2  *  * echo $PWD >> ~/log.txt

# 每周一上午8点到12点的第2和第32分钟执行
2,32 8-12 * * 1 echo $PWD >> ~/log.txt

launchctl定时任务

launchctl 通过配置文件指定执行周期和任务,最小时间间隔是1s。

plist文件存放路径:

  • /Library/LaunchAgents:仅当用户登陆后才被执行
  • /Library/LaunchDaemons:系统启动就会被执行

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.iospack.launchctl.plist</string>
    <key>UserName</key>
    <string>jenkinsServer</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/jenkinsServer/iospack/launchctl/timertask.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>

    //1.指定固定间隔
    <key>StartInterval</key>
    <integer>7200</integer>

    //2.类似crontab,指定固定时间
    <key>StartCalendarInterval</key>
    <dict>
    <key>Minute</key>
    <integer>4</integer>
    <key>Hour</key>
    <integer>13</integer>
    </dict>

    <key>StandardOutPath</key>
    <string>/Users/jenkinsServer/iospack/launchctl/success.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/jenkinsServer/iospack/launchctl/error.log</string>
    <key>Debug</key>
    <true/>
</dict>
</plist>

参数:

  • StartInterval:固定间隔时间,单位 s
  • StartCalendarInterval: 执行周期,类似crontab 时间规范
  • RunAtLoad: 加载时执行一次
  • StandardOutPath: 标准输出路径
  • StandardErrorPath: 错误输出路径

这里解释一下 StartCalendarInterval: 可以指定脚本在多少分钟、小时、天、周几、某月上执行,类似如crontab的中的设置,包含下面的 key。

Minute <integer>
The minute on which this job will be run.
Hour <integer>
The hour on which this job will be run.
Day <integer>
The day on which this job will be run.
Weekday <integer>
The weekday on which this job will be run (0 and 7 are Sunday).
Month <integer>
The month on which this job will be run.

管理定时任务

  • 加载任务
cd ~/Library/LaunchAgents
launchctl load com.test.launchctl.plist
  • 立即执行一次任务
launchctl start com.test.launchctl.plist
  • 停止、卸载、删除任务
launchctl stop com.test.launchctl.plist
launchctl unload com.test.launchctl.plist
launchctl remove com.iospack.launchctl.plist
sudo rm -rf /Library/LaunchDaemons/com.iospack.launchctl.plist

参考链接


crontab 定时任务

OS X 添加定时任务

Tags: Shell
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章