通过计划脚本自动执行任务是许多管理员每天依赖的强大功能。 常规的 Mac 用户还可以通过 Apple 首选的任务自动化和管理工具 launchd 来利用此功能 macOS。 从安排简单的任务(例如在特定时间关闭 Wi-Fi)到执行复杂的系统备份以在第二天开始 Mac 可以帮助您自动化工作流程、节省时间并确保您的系统完全按照您希望的方式运行。
内容
正在推出什么?
正如管弦乐队需要指挥来指挥和协调不同的乐器一样, macOS Ventura 拥有无数的流程和服务,依靠 launchd 来确保一切完美地协同工作。 作为第一个过程 macOS 当您启动内核时,launchd 占据中心舞台,协调所有后续进程、服务和应用程序,就像指挥家第一次举起指挥棒宣布交响乐开始一样。
除了在系统编排中的作用之外,launchd 还可用于调度脚本,即为执行特定任务而编写的一系列命令。 这种情况发生在 launchctl
作为用户通信和控制发射导体的接口的命令。
很高兴知道: 下载种子? 使用设备上的终端下载种子来提高效率 Mac。
恶魔与特工
launchd 有时被称为守护程序,是一种作为后台进程运行的计算机程序,通常不设计用于由用户直接控制。 就守护进程而言,launchd 很特别,因为它是所有其他守护进程的大师 macOS 守护进程,它可以决定它们何时启动和停止。 这些子守护进程在 root 用户下运行,因此几乎可以执行任何操作。
然而,作为对任务调度感兴趣的用户,在 root 用户下运行脚本并不总是可取或必要的。 这就是代理发挥作用的地方。 代理代表登录用户运行,提供更受限制的环境并确保使用该特定用户的权限和首选项执行脚本或任务。 例如,如果您希望运行一个脚本来更改设置或访问您帐户中的文件,请使用代理。
提示:您长期喜爱的一些设备存在兼容性问题 Mac 应用? 了解如何安装 32 位 Linux 在旧的 Mac。
编写脚本
要通过 launchd 运行代理或守护程序,您需要编写一些脚本。 最常见的脚本语言是 bash。 如果你想了解更多 bash 有关脚本编写,请参阅我们的初学者指南 bash 脚本编写。
您的 launchd 脚本可以位于两个不同的位置,具体取决于您希望它们作为代理还是守护程序运行:
- 充当代理并代表登录用户执行操作的脚本应存储在 ~/Library/LaunchAgents 中。
- 相反,旨在充当操作系统范围内的守护程序且独立于登录用户的脚本属于 /Library/LaunchDaemons。
请记住,代理没有 root 权限,因此无法执行需要完全系统访问权限的任务。 另一方面,守护进程以 root 权限运行,并且可以执行影响整个系统的任务。
很高兴知道:你可以更深入地控制自己 Mac 激活 root 用户可以访问整个文件系统。
工作介绍
launchd 中的脚本由作业定义触发,作业定义是存储在特定目录中的 .plist 文件。 这些 XML 文件为作业提供名称、指定要启动的脚本以及指定脚本应运行的时间。 编写脚本后,编写并加载在正确时间启动脚本的作业定义。 工作定义看起来像这样:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>local.restart</string> <key>Program</key> <string>/Users/user/Scripts/restart.sh</string> <key>RunAtLoad</key> <true/> </dict> </plist>
根据需要对其进行修改,然后将其粘贴到扩展名为 .plist 的文本文件中,然后将其放入正确的目录中(参见上文)。
职位描述由几个重要部分组成:
- 标签: launchd 中作业的名称。 每项工作都必须是唯一的。 这些都是用反向域名表示法编写的,“本地”对于私人代理来说是一个很好的域名。
- 程序: 启动此作业描述的脚本的完整路径。
- 加载时运行: 描述何时应该执行脚本。 有不同的方法:
- RunAtLoad:加载作业定义后立即运行。 每次充电仅运行一次。
- StartInterval:每n秒启动一次作业。
- StartCalendarInterval:在特定时间和日期运行作业。
提示:这些脚本文件需要更多空间吗? 了解如何清除您的缓存 Mac 以快速释放存储空间。
作业被加载到 launchctl 中
创建脚本并将代理保存在正确的位置后,您需要加载它 launchctl
。 当您将来注册时,这将自动发生。
要查看 laucnhctl 当前正在运行的内容,您可以使用 launchctl list
在终端中。 可以通过像这样标记它来搜索这个巨大的列表来搜索您的脚本:
launchctl list | grep local.restart
要加载脚本,请打开终端并使用以下命令:
launchctl load ~/Library/LaunchAgents/local.restart.plist

要从 launchctl 队列中删除脚本,请使用 unload
命令:
launchctl unload ~/Library/LaunchAgents/local.restart.plist

加载作业会将其放入启动队列中,并且作业将在其启动条件中指定的时间运行。 如果你确实想立即运行脚本,你应该使用 start 命令:
launchctl start local.restart
此命令采用作业名称,并且仅在作业已加载时才有效 launchctl
。
提示: 成为某种东西 Mac 高级用户可以使用 Raycast 或 Alfred 快速启动您喜爱的应用程序。
经常问的问题
如何检查 launchd 是否已启动脚本?
您可以使用… launchctl list
终端中的命令。 这将显示所有加载的作业。 要查找特定脚本或作业,请使用 grep
例如。, launchctl list | grep your_script_name
。
如果 launchd 使用太多系统资源会发生什么?
如果 launchd 消耗过多资源,通常是由于脚本或作业错误造成的。 您应该检查最近添加的脚本并使用以下命令卸载它们 launchctl unload /path/to/job.plist
。
cron 和 launchd 有什么区别?
cron 和 launchd 都是调度服务,但它们的工作方式不同。 cron 是一种基于 Unix 的较旧作业调度程序,它按固定时间或按 crontab 文件中定义的时间间隔运行作业。 launchd 是 Apple 的新系统 macOS 这可以根据各种触发器(而不仅仅是时间)启动作业。
另外,我可以使用其他脚本语言吗? bash 与启动?
launchd 可以运行任何可以从终端运行的脚本。 这包括用 Python、Perl、Ruby 和其他语言编写的脚本。