#macos #periodic #schedule #repeat #service

launchd

Rust 库,用于创建和解析 launchd 文件

3 个版本 (破坏性更新)

0.3.0 2023 年 8 月 8 日
0.2.0 2021 年 3 月 26 日
0.1.0 2021 年 3 月 23 日

#5 in #mac-os

Download history 17/week @ 2024-06-29 5/week @ 2024-07-20 33/week @ 2024-07-27

每月下载 55

MIT 许可证

51KB
1K SLoC

launchd

A Rust library for creating and parsing Launchd files.

免责声明

目前仍处于早期开发阶段,所有帮助都受欢迎。

构建 launchd 文件的语法仍可能发生变化。Launchd 有很多属性,我正在考虑使用 derive_builder 或类似工具来减少样板代码,并提高可维护性。我希望能在这个版本 v0.4.0 中做出决定。建议欢迎欢迎

Launchd 结构尚未完整。字段设计上不是公开的,因此我可以通过补丁添加(但不能删除)字段,而无需创建新的次要版本。

此库大部分未经过测试。这对大多数程序来说不是一个大问题。唯一真正的问题是与 cron 功能有关。

我还在考虑如果向结构中添加未初始化的 CalendarInterval 将会发生什么。应该抛出异常,还是应该静默过滤掉,或者我应该将此责任留给用户。目前这是您自己的责任,但这种行为可能会在未来发生变化。

常见问题解答

什么是 Launchd?

Launchd 是 MacOS 中安排程序和服务的调度方式。

更多信息: Wiki

有关参数的更详细描述,请在您的 Apple 计算机上运行 man launchd.plist,或查看: manpagezxcode-man-pages

为什么不使用 cron?

MacOS 已弃用 cron,这是以前安排程序的方式。

此库还提供了在选择 cron 功能时将 crontabs 解析为 CalendarInterval 的方法。 免责声明:此功能尚未经过测试。

为什么不使用 systemd?

由于许可问题,MacOS 不支持 systemd。此库不包括 systemd 的解析。

使用方法

将此添加到您的 Cargo.toml 依赖项

launchd = "0.3.0"

功能

默认

launchd = {version = "0.3.0", features=["io"]}

翻译 crontabs

launchd = {version = "0.3.0", features=["cron"]}

无 plist 编写器

launchd = {version = "0.3.0", default-features = false, features=["serde"]}

示例

use std::path::Path;
use launchd::{CalendarInterval, Error, Launchd};
fn main() -> Result<(), Error> {
    let ci = CalendarInterval::default()
        .with_hour(12)?
        .with_minute(10)?
        .with_weekday(7)?;

    let launchd = Launchd::new("LABEL", Path::new("./foo/bar.txt"))?
            .with_user_name("Henk")
            .with_program_arguments(vec!["Hello".to_string(), "World!".to_string()])
            .with_start_calendar_intervals(vec![ci])
            .disabled();
    
    launchd.to_writer_xml(std::io::stdout())
}

结果

<?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>Label</key>
        <string>LABEL</string>
        <key>Disabled</key>
        <true />
        <key>UserName</key>
        <string>Henk</string>
        <key>Program</key>
        <string>./foo/bar.txt</string>
        <key>ProgramArguments</key>
        <array>
                <string>Hello</string>
                <string>World!</string>
        </array>
        <key>StartCalendarIntervals</key>
        <array>
                <dict>
                        <key>Minute</key>
                        <integer>10</integer>
                        <key>Hour</key>
                        <integer>12</integer>
                        <key>Weekday</key>
                        <integer>7</integer>
                </dict>
        </array>
</dict>
</plist>

依赖项

~0.3–6.5MB
~37K SLoC