创建定时任务主要就是为了每天固定运行一下脚本之类的。比如cocoapods
仓库每天总是有新的第三方库提交,那么pod update
的时候就会更新master分支,所以我就需要每天定时更新master,省得到时候再去pull master。
launchctl 定时任务
一般最常用的就是launchctl
这种定时方式了。它是通过plist配置的方式来实现定时任务的。
plist文件格式
上图就是一个简单的定时任务的plist文件。下面来简单说一下里面Key的意思。
Label(String)
任务名称,建议和文件名一样Program(String)
要定时执行的脚本,绝对路径ProgramArguments (Array)
要定时执行的脚本和一些参数,绝对路径。如果上面的Program省略的话执行的就是ProgramArguments
里的第一个元素。StandardErrorPath(String)
脚本执行错误时的输出日志,绝对路径StandardOutPath(String)
脚本输出的内容,绝对路径StartCalendarInterval(Dictionary)
脚本运行的时间。Minute, Hour, Day, Month, Weekday。StartInterval(Number)
间隔运行的时间,单位为秒。Disabled(Boolean)
是否不可用,默认为NO可用。LimitLoadToSessionType(String)
限制访问的类型。AQUA:一个GUI剂,即限制访问所有GUI服务。这个Key好像没什么用,可用不填。RunAtLoad(Boolean)
标识launchd在加载完该项服务之后立即启动路径指定的可执行文件。默认值为false。KeepAlive(Boolean)
这个key值是用来控制可执行文件是持续运行呢,还是满足具体条件之后再启动。默认值为false,也就是说满足具体条件之后才启动。当设置值为ture时,表明无条件的开启可执行文件,并使之保持在整个系统运行周期内。
plist文件放置处
- ~/Library/LaunchAgents 由用户自己定义的任务项(推荐)
- /Library/LaunchAgents 由管理员为用户定义的任务项
- /Library/LaunchDaemons 由管理员定义的守护进程任务项
- /System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
- /System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项
建议放在 ~/Library/LaunchAgents 下面。
下面再来理解几个基础概念:
/System/Library和/Library和~/Library目录的区别?
/System/Library目录是存放Apple自己开发的软件。
/Library目录是系统管理员存放的第三方软件。
~/Library/是用户自己存放的第三方软件。
LaunchDaemons和LaunchAgents的区别?
LaunchDaemons是用户未登陆前就启动的服务(守护进程)。
LaunchAgents是用户登陆后启动的服务(守护进程)。
launchctl 命令
添加: launchctl load /System/Library/LaunchAgents/com.test.plist
移除: launchctl unload /System/Library/LaunchAgents/com.test.plist
查看: launchctl list
立即执行任务:launchctl start com.aigo.launchctl.plist
停止执行任务:launchctl stop com.aigo.launchctl.plist
注意:
- 你所运行的脚本需要有权限才能执行:
chmod a+x test.sh
- 要让任务生效,必须先load命令加载这个plist
- 如果任务被修改了,那么必须先unload,然后重新load
- start可以测试任务,这个是立即执行,不管时间到了没有
- 执行start和unload前,任务必须先load过,否则报错
- ProgramArguments内不能直接写命令,只能通过shell脚本来执行
launchctl的GUI工具
LaunchControl,用这个工具可以查看到所有的launchctl定时任务。并用GUI的方式进行修改执行等。