根据手册页launchctl
(重点是我的):
-w 覆盖已禁用键并将其设置为 false。在以前的版本中,此选项会修改配置文件。现在,“禁用”项的状态存储在磁盘的其他位置。
由于禁用标志的当前状态不再在.plist
文件本身中设置,因此检查密钥Disabled
不再是判断服务是否会在下次启动时运行的准确方法。
这个“磁盘上的其他地方”在哪里?更确切地说(也是更重要的),如何检查此标志是否已设置?
另外,是否可以设置服务在下次启动时运行没有强制其立即启动(与launchctl load -w /Library/LaunchDaemons/my-service.plist
)?
答案1
现在(从 10.6.x 开始)禁用存储在 /private/var/db/launchd.db/com.apple.launchd/overrides.plist 中,如下所示:
<key>com.apple.AppleFileServer</key>
<dict>
<key>Disabled</key>
<true/>
</dict>
您可以解析此文件以查看哪些 launchd 项被覆盖,但该文件设置为仅限 root 访问权限(“-rw------- 1 root wheel”),并且不能保证 Apple 不会在 10.7 中再次更改存储方式...
另外,我不知道有什么方法可以让现有的 launchd 项目在下次启动时加载,而无需立即加载它。(如果是新项目,则没问题:确保其中有 Disabled=false,然后将其放入 /Library/LaunchDaemons。)
答案2
对于新版本的 macOS,launchctl
语法和命令已改变。
以下内容已在 macOS High Sierra ( 10.13.4
) 上进行了测试:
launchctl print user/$(id -u)
# For GUI domain (effectively "flat" with login domain)
# See man launchctl for details
launchctl print gui/$(id -u)
launchctl print
您可以使用和命令的变体查看系统上附加到您的用户的服务的许多属性launchctl list
。例如,要查看禁用标志的状态,请查找如下部分:
disabled services = {
{
"com.apple.macbuddy.icloudsetup.user" => false
"com.apple.ManagedClientAgent.enrollagent" => true
"com.apple.FileStatsAgent" => false
"com.apple.FolderActionsDispatcher" => true
"homebrew.mxcl.postgresql" => false
"com.apple.appleseed.seedusaged.postinstall" => true
"homebrew.mxcl.mysql" => false
}
答案3
谨防!
尽管我用过LaunchControl 启动 GUI添加已禁用标签,我的经纪人仍在推出!
你的评论查尔斯·达菲这里引用的内容可以解释原因:
“由于禁用标志的当前状态不再在 .plist 文件本身中设置,因此检查已禁用键不再是判断服务是否会在下次启动时运行的准确方法。”
总结
最终残疾检查
$ launchctl print-disabled user/$(id -u) |grep true