Mac 定时任务 launchctl
launchctl
launchctl: 是一个统一的服务管理框架,可以启动、停止和管理守护进程、应用程序、进程和脚本等。
launchctl是通过配置文件来指定执行周期和任务的。
配置文件(plist文件)
launchctl 将根据plist文件的信息来启动任务。
plist文件位置:
- ~/Library/LaunchAgents 由用户自己定义的任务项(推荐)
- /Library/LaunchAgents 由管理员为用户定义的任务项
- /Library/LaunchDaemons 由管理员定义的守护进程任务项
- /System/Library/LaunchAgents 由Mac OS X为用户定义的任务项
- /System/Library/LaunchDaemons 由Mac OS X定义的守护进程任务项
plist部分参数说明:
- Label:全局唯一性;
- ProgramArguments:指定要运行的脚本
- StartCalendarInterval:可以指定脚本在多少分钟、小时、天、星期几、月时间上执行
- StartInterval:指定脚本每间隔多长时间(单位:秒)执行一次;
- StandardInPath、StandardOutPath、StandardErrorPath:标准的输入、输出、错误文件。
相关命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 加载任务, -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
|
使用
-
新建
1 2 3
| demo - com.test.plist - testshell.sh
|
-
内容:
com.test.plist
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| <?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.test</string>
<key>Program</key> <string>/Users/weichanglu/Desktop/demo/testShell.sh</string>
<key>ProgramArguments</key> <array> <string>/Users/weichanglu/Desktop/demo/testShell.sh</string> </array>
<key>StartCalendarInterval</key> <dict> <key>Minute</key> <integer>30</integer>
<key>Hour</key> <integer>9</integer>
<key>Day</key> <integer>1</integer>
<key>Month</key> <integer>5</integer>
<key>Weekday</key> <integer>0</integer> </dict>
<key>StartInterval</key> <integer>3</integer>
<key>StandardInPath</key> <string>/Users/uniflor/runin.log</string>
<key>StandardOutPath</key> <string>/Users/weichanglu/Desktop/demo/success.log</string>
<key>StandardErrorPath</key> <string>/Users/weichanglu/Desktop/demo/error.log</string> </dict> </plist>
|
testshell.sh
1 2 3 4 5
| #!/bin/bash echo `date` >> ~/Desktop/demo/success.log time=$(date "+%Y-%m-%d %H:%M:%S") echo "$time" >> ~/Desktop/demo/time.txt
|
-
将 plist 文件复制到 ~/Library/LaunchAgents
目录下,需要权限。
-
终端执行 $ cd ~/Library/LaunchAgents
,目录下,执行启动服务命令,参考上面命令。
-
查看输出文件。
路径基础概念
/System/Library和/Library和~/Library目录的区别?
/System/Library目录是存放Apple自己开发的软件。
/Library目录是系统管理员存放的第三方软件。
~/Library/是用户自己存放的第三方软件。
LaunchDaemons和LaunchAgents的区别?
LaunchDaemons是用户未登陆前就启动的服务(守护进程)。
LaunchAgents是用户登陆后启动的服务(守护进程)。
补充
- 运行异常:
... operation not permitted ...
解决方案:暂时关闭Mac rootless机制
- 权限问题
注意,脚本要改成可执行的权限:
chmod 777 *.sh
launchctl的GUI工具
LaunchControl,用这个工具可以查看到所有的launchctl定时任务。并用GUI的方式进行修改执行等。
参考
OS X 添加定时任务
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!