mac定时执行任务
1、launchctl
launchctl: 是一个统一的服务管理框架,可以启动、停止和管理守护进程、应用程序、进程和脚本等。
launchctl是通过配置文件来指定执行周期和任务的。
配置文件(plist文件)
launchctl 将根据plist文件的信息来启动任务。
plist脚本一般存放在以下目录:
/Library/LaunchDaemons
-->只要系统启动了,哪怕用户不登陆系统也会被执行/Library/LaunchAgents
-->当用户登陆系统后才会被执行
更多的plist存放目录:
~/Library/LaunchAgents 由用户自己定义的任务项
/Library/LaunchAgents 由管理员为用户定义的任务项
/Library/LaunchDaemons 由管理员定义的守护进程任务项
/System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
/System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项
plist部分参数说明:
- Label:对应的需要保证全局唯一性;
- Program:要运行的程序;
- ProgramArguments:命令语句
- StartCalendarInterval:在指定时间执行,类似crontab
- StartInterval:循环执行时间,单位为秒
- StandardInPath、StandardOutPath、StandardErrorPath:标准的输入输出错误文件,这里建议不要使用 .log 作为后缀,会打不开里面的信息。
- 定时启动任务时,如果涉及到网络,但是电脑处于睡眠状态,是执行不了的,这个时候,可以定时的启动屏幕就好了
任务相关命令
# 加载任务, -w选项会将plist文件中无效的key覆盖掉,建议加上
$ launchctl load -w com.test.plist
# 删除任务
$ launchctl unload -w com.test.plist
# 查看任务列表, 使用 grep '任务部分名字' 过滤
$ launchctl list | grep 'test.demo'
# 开始任务
$ launchctl start com.test.plist
# 结束任务
$ launchctl stop com.test.plist
注意:
如果任务被修改了,那么必须先unload,然后重新load
start可以测试任务,这个是立即执行,不管时间到了没有
执行start和unload前,任务必须先load过,否则报错
stop可以停止任务
<?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>
<!-- Label唯一的标识 -->
<key>Label</key>
<string>com.test</string>
<!-- 指定要运行的脚本 -->
<key>ProgramArguments</key>
<array>
<string>/Users/jamalping/Desktop/testShell.sh</string>
</array>
<!-- 在指定时间运行 -->
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>1</integer>
<key>Hour</key>
<integer>0</integer>
</dict>
<!-- 循环秒数执行 -->
<key>StartInterval</key>
<integer>3</integer>
<key>StandardOutPath</key>
<!-- 标准输出文件 -->
<string>/Users/jamalping/Desktop/stdout</string>
<!-- 标准错误输出文件,错误日志 -->
<key>StandardErrorPath</key>
<string>/Users/jamalping/Desktop/error.txt</string>
</dict>
</plist>
- 加载任务
launchctl load -w com.test.plist
- 开始任务
launchctl start -w com.test.plist
权限问题解决:
sudo chown root /Users/xxx/Library/LaunchAgents/sc.plist
sudo chgrp wheel /Users/xxx/Library/LaunchAgents/sc.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>
<!-- Label唯一的标识 -->
<key>Label</key>
<string>sc</string>
<!-- 指定要运行的脚本 -->
<key>ProgramArguments</key>
<array>
<string>/Users/xxx/Program/sc</string>
</array>
<!-- 时间间隔(秒) -->
<key>StartInterval</key>
<integer>1200</integer>
</dict>
</plist>