本文介绍如何使用launchctl定时执行脚本任务以及错误定位。 我的macbook是arm64架构,在执行launchctl遇到start失败的问题,花了几天时间才解决。在此记录一下,供参考。
一、创建plist文件
要创建的plist文件的父目录可以是:
- /System/Library/LaunchAgents/
- /System/Library/LaunchDaemons/
- /Library/LaunchAgents/
- /Library/LaunchDaemons/
- ~/Library/LaunchAgents/
- ~/Library/LaunchDaemons/
其中1、2是系统级别的,3、4是全局级别的,5、6是用户级别。Daemon是守护进程。使用5即可满足我的定时需求。文件内容如下:
? cat ~/Library/LaunchAgents/service.plist
<!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>your_service_name</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/username/xx.sh</string>
</array>
<key>StartInterval</key>
<integer>2419200</integer>
</dict>
</plist>
其中ProgramArguments是要执行的命令。
二、加载和启动
使用下面命令加载/卸载/启动/停止该plist执行的任务:
launchctl load a.plist # 加载
launchctl start a_service_name # 启动
launchctl stop a_service_name # 暂停
launchctl list # 查看所有服务状态
每次修改plist文件需要重新加载再启动。launchctl list 打印的三列分别是PID、执行状态码、服务名。
三、问题和解决
在这个简单定时实现的过程中,我遇到了各种问题。执行状态码出现过126,127,3等等。可以用launchctl error 来看这个执行状态码的含义。下面给出plist内容注意事项:
- 不能使用~指代用户目录,必须用绝对路径
- 一定要将待执行脚本放到launchctl可访问的目录
(很tricky的地方是,我的家目录下脚本可以访问,但是家下的Documents/下的脚本不能访问) - 你的命令(plist中指定的第一个参数,可以是系统程序或你的脚本)一定要有执行权限
- 环境变量可能不是你预期的那样,故有些命令需要写绝对路径
|