使用Launchd 解决黑苹果时间校准的问题
装上黑苹果之后,系统时间总是走着走着就慢了,于是在有些地方会出现上不了网的情况(例如:斗鱼直播都看不了)。
于是,提供以下三种方法解决。
手动校准时间
- 打开“日期与时间便好设置”,关闭并重新打开“自动设置日期与时间”
- 缺点在于,一步一步打开很繁琐,而且需要解锁设置(输入密码)后才可更改
使用shell 脚本手动校准时间
- 使用文本编辑或用vim 在桌面新建一个文本,命名为
校对时间
,输入以下内容
#校对时间
#!/bin/zsh
sudo sntp -sS time.apple.com
exit;
- 给新建的脚本可运行的权限
chmod u+x ~/Desktp/校对时间
- 当时间不准确时,在桌面之间点击脚本运行即可
- 缺点在于,每次校对时间都需要手动点击运行,而且每次都需要输入密码
使用Launchd 自动定时校对时间
出问题的尝试
- 新建plist 文件并编辑
> cd /Library/LaunchAgents
> sudo touch com.persipa.time.update.plist
> sudo vi com.persipa.time.update.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>Disabled</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<!-- 这个Label的值需要保证系统唯一 -->
<string>com.persipa.time.update</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/sntp</string>
<string>-sS</string>
<string>time.apple.com</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>
- 注意:其中的Label 的值需要唯一,且文件名以Label 的值命名(未确认是否必须,不过一般这么命名,印象中是需要的)
- 加载启动项
> sudo launchctl load /Library/LaunchAgents/com.persipa.time.update.plist
到这里应该就已经完成了。
- 如果需要确认是否已经加载成功,可以使用
sudo launchctl list
命令,如果出现com.persipa.time.update
(Label 的值),并且状态值(Status)为0,则已经视为加载成功。 - 如果需要确认脚本有效,可以事先将系统时间修改一下,再加载启动项,加载完毕后,应该会看到系统时间自动校对了。
出现的问题
一两天后看时间,又不准了,看了一下报错,权限不足。那么在`/Library/LaunchAgents` 文件夹里的内容在自动运行时无法使用root 用户的权限运行。
经过翻阅官网文档和其他资料,`/Library/LaunchAgents` 文件夹中运行的程序,都会以当前用户的权限运行,`sntp` 命令需要以管理员权限运行,因此平时登录的用户无法运行。
解决的方法
将plist 文件放入`/Library/LaunchDaemons` 文件夹中,重新加载启动项。
> sudo launchctl load /Library/LaunchDaemons/com.persipa.time.update.plist
附:苹果官网文档
在一两天之后,看到时间都是准的,这回应该没有问题了。
其他注意事项
- 将plist 文件放在
/Library/LaunchAgents
目录中,启动项将会以root 权限执行,这样就不需要输入管理员密码了。 - 需要确认plist 的属主是root 用户,如果非root 用户,加载启动项的时候可能会失败,而且不会以root 权限执行。
- 使用了sntp 命令,需要在plist 文件中需要使用绝对路径。
StartInterval
的值单位为秒,表示每隔多少秒运行一次,根据需要改变。- 可以在plist 文件中加上以下内容,将脚本的出错输出
<key>StandardErrorPath</key>
<string>/tmp/com.persipa.time.update.err</string>
使用Launchd 解决黑苹果时间校准的问题
https://www.persipa.site/2020/time-check-out