LaunchAgent 提供了一种简便的方法,以编程方式创建和维护 launchd
代理和守护进程,而无需手动构建属性列表(Property Lists)。
请查看完整的 文档。
LaunchAgent 可以使用程序参数数组创建
LaunchAgent(label: "local.PythonServer", program: ["python", "-m", "SimpleHTTPServer", "8000"])
或者使用可变参数创建
LaunchAgent(label: "local.PythonServer", program: "python", "-m", "SimpleHTTPServer", "8000")
也可以仅使用标签创建代理,但如果加载它将无效
LaunchAgent(label: "local.PythonServer")
创建新代理时需要将其写入磁盘
let agent = LaunchAgent(label: "local.PythonServer", program: "python", "-m", "SimpleHTTPServer", "8000")
do {
try LaunchControl.shared.write(agent)
try agent.load()
agent.start()
} catch {
print("Unexpected error:" error)
}
LaunchControl
类可以从 ~/Library/LaunchAgents
读取代理,并将代理写入其中。使用任一方法时,都将设置已加载代理的 url
。
LaunchAgent 具有 load()
、unload()
、start()
、stop()
和 status()
方法,它们的功能与其名称一致。
加载(Load)和卸载(Unload)需要设置代理的 URL 参数,否则 launchctl
将无法找到它们。启动(Start)、停止(Stop)和状态(Status)的调用基于标签。
LaunchAgent 目前不支持所有键,并且对某些支持的键有一些注意事项。
LaunchAgent
类中的大多数参数都是可选的,设置 nil
将从编码的 plist 中删除该键。某些键使用其自身的类型来封装复杂的字典值。
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
Label(标签) | String(字符串) | 是 | |
Disabled(已禁用) | String(字符串) | 是 | |
Program(程序) | String(字符串) | 是 | |
ProgramArguments(程序参数) | [String](字符串数组) | 是 | |
EnableGlobbing(启用全局匹配) | Bool(布尔值) | 是 | 在 macOS 中已弃用 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
workingDirectory(工作目录) | String(字符串) | 是 | |
standardInPath(标准输入路径) | String(字符串) | 是 | |
standardOutPath(标准输出路径) | String(字符串) | 是 | |
standardErrorPath(标准错误路径) | String(字符串) | 是 | |
environmentVariables(环境变量) | [String: String](字符串键值对) | 是 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
runAtLoad(加载时运行) | Bool(布尔值) | 是 | |
startInterval(启动间隔) | Int(整数) | 是 | |
startCalendarInterval(启动日历间隔) | StartCalendarInterval | 是 | |
startOnMount(挂载时启动) | Bool(布尔值) | 是 | |
onDemand(按需启动) | Bool(布尔值) | 是 | |
keepAlive(保持运行) | Bool(布尔值) | 是 | |
watchPaths(监视路径) | [String](字符串数组) | 是 | |
queueDirectories(队列目录) | [String](字符串数组) | 是 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
umask | Int(整数) | 是 | 使用 FilePermissions.umaskDecimal 获取有效值 |
sessionCreate(创建会话) | Bool(布尔值) | 是 | |
groupName(组名) | String(字符串) | 是 | |
userName(用户名) | String(字符串) | 是 | |
initGroups(初始化组) | Bool(布尔值) | 是 | |
rootDirectory(根目录) | String(字符串) | 是 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
launchOnlyOnce(仅启动一次) | Bool(布尔值) | 是 | |
limitLoadToSessionType(限制加载到会话类型) | [String](字符串数组) | 是 | 始终编码为数组 |
limitLoadToHosts(限制加载到主机) | [String](字符串数组) | 是 | |
limitLoadFromHosts(限制从主机加载) | [String](字符串数组) | 是 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
AbandonProcessGroup(放弃进程组) | Bool(布尔值) | 是 | |
EnablePressuredExit(启用受压退出) | Bool(布尔值) | 是 | |
EnableTransactions(启用事务) | Bool(布尔值) | 是 | |
ExitTimeOut(退出超时) | Int(整数) | 是 | |
inetdCompatibility(inetd 兼容性) | inetdCompatibility(inetd 兼容性) | 是 | |
HardResourceLimits(硬资源限制) | ResourceLimits(资源限制) | 是 | |
SoftResourceLimits(软资源限制) | ResourceLimits(资源限制) | 是 | |
TimeOut(超时) | Int(整数) | 是 | |
ThrottleInterval(节流间隔) | Int(整数) | 是 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
MachServices | [String: MachService](字符串 MachService 键值对) | 是 | |
Sockets | 否 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
调试 | Bool(布尔值) | 是 | 已弃用 |
WaitForDebugger(等待调试器) | Bool(布尔值) | 是 |
键名 | 键类型 | 是否支持 | 注释 |
---|---|---|---|
LegacyTimers(旧计时器) | Bool(布尔值) | 是 | |
LowPriorityIO(低优先级 IO) | Bool(布尔值) | 是 | |
LowPriorityBackgroundIO(低优先级后台 IO) | Bool(布尔值) | 是 | |
Nice | Int(整数) | 是 | |
ProcessType(进程类型) | ProcessType 枚举 | 是 |
StartCalendarInterval
封装了用于设置基于日历的任务间隔的字典。默认情况下,所有值都设置为 nil
,这意味着任务将在该值的任何出现时运行。
Month(月)和 Weekday(星期)键由每个月和星期的枚举表示。Day(日)、Hour(时)和 Minute(分)值只是整数。 它们会检查其各自时间范围内的有效性,并将根据超出范围的方式设置为最小值或最大值。
封装了 inetdCompatibility
的 wait
键。
封装了 SoftResourceLimits(软资源限制)和 HardResourceLimits(硬资源限制)键
用于读取、写入和执行的各个权限 Unix 位。
此外,您还可以获取 umask 值。
为 LaunchAgent 设置权限时,请使用 .umaskDecimal
获取该值。 如果您正在读取 LaunchAgent,FilePermissions(umask:)
将读取十进制值,以便可以更新权限。