toby

mac下使用launchctl定时任务

launchctl通过使用sh脚本,配合plist配置文件实现定时任务,先看一个例子:

首先创建sh文件,必须保证它是可执行的(权限),我这里假设是savehtml.sh:

cd /Users/username/Desktop/my.me/speed/
/usr/local/bin/node savehtml.js

这里得注意的是对于node这种非系统自带的命令,需要指定命令的绝对路径,否则异常信息log文件会提示找不到命令

然后提权操作:

chmod 777 savehtml.sh

这样就定义好一个脚本命令了,接下来看一下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.username.test</string>  
  <key>ProgramArguments</key>  
  <array>  
    <string>/Users/username/Desktop/my.me/speed/savehtml.sh</string>  
  </array>  
  <key>StartCalendarInterval</key>  
  <dict>  
        <key>Minute</key>  
        <integer>10</integer>  
        <key>Hour</key>  
        <integer>10</integer>  
  </dict>  
  <key>StandardOutPath</key>  
<string>/Users/username/Desktop/my.me/speed/success.log</string>  
<key>StandardErrorPath</key>  
<string>/Users/username/Desktop/my.me/speed/fetcherror.log</string>  
</dict>  
</plist>

这里label是任务名,可以随便写,下面ProgramArguments对应的是刚刚创建的sh文件的路径,也是绝对路径,StartCalendarInterval里面定义了任务触发时间,这里是每天的10点10分,StandardOutPath以及StandardErrorPath分别是任务日志以及错误日志,把这个文件保存成.plist格式,放到~/Library/LaunchAgents目录下面,保存的plist名称可以任意.

接下来得将任务推入计划任务中,并且启动任务,load用于加载定时任务,start用于启动,stop用于结束,unload用来取消任务,这里得注意如果修改了plist文件,需要unload以下当前的任务,再重新部署当前的定时任务.比如这里,我们启动以下savehtml.sh这个定时任务

launchctl load /Users/username/Library/LaunchAgents/com.username.test.plist //这里plist也得指定绝对路径
launchctl start com.username.test

如果想查看当前所有计划任务,可以用list命令

launchctl list

参考来源:http://ylq365.iteye.com/blog/1878917