使用Launchd 解决黑苹果时间校准的问题
技术 Hackintosh Launchd 40
装上黑苹果之后,系统时间总是走着走着就慢了,于是在有些地方会出现上不了网的情况(例如:斗鱼直播都看不了)。
于是,提供以下三种方法解决。

手动校准时间

  1. 打开“日期与时间便好设置”,关闭并重新打开“自动设置日期与时间”
  • 缺点在于,一步一步打开很繁琐,而且需要解锁设置(输入密码)后才可更改

使用shell 脚本手动校准时间

  1. 使用文本编辑或用vim 在桌面新建一个文本,命名为校对时间,输入以下内容
#校对时间
#!/bin/zsh
sudo sntp -sS time.apple.com
exit;
  1. 给新建的脚本可运行的权限
chmod u+x ~/Desktp/校对时间
  1. 当时间不准确时,在桌面之间点击脚本运行即可
  • 缺点在于,每次校对时间都需要手动点击运行,而且每次都需要输入密码

使用Launchd 自动定时校对时间

出问题的尝试

  1. 新建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 的值命名(未确认是否必须,不过一般这么命名,印象中是需要的)
  1. 加载启动项
> 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

附:苹果官网文档

在一两天之后,看到时间都是准的,这回应该没有问题了。

其他注意事项

  1. 将plist 文件放在/Library/LaunchAgents 目录中,启动项将会以root 权限执行,这样就不需要输入管理员密码了。
  2. 需要确认plist 的属主是root 用户,如果非root 用户,加载启动项的时候可能会失败,而且不会以root 权限执行。
  3. 使用了sntp 命令,需要在plist 文件中需要使用绝对路径。
  4. StartInterval的值单位为秒,表示每隔多少秒运行一次,根据需要改变。
  5. 可以在plist 文件中加上以下内容,将脚本的出错输出
	<key>StandardErrorPath</key>
	<string>/tmp/com.persipa.time.update.err</string>
使用Launchd 解决黑苹果时间校准的问题
https://www.persipa.site/2020/time-check-out
作者
Persipa
发布于
更新于
许可