#systemd #systemd-unit #tasks #task-scheduling #wake #up #scheduled

bin+lib systemd-wake

使用 systemd 来唤醒未来的任务

3 个版本

0.1.2 2023年4月27日
0.1.1 2023年4月10日
0.1.0 2023年4月10日

#550Unix API

MIT 许可证

17KB
271 代码行

systemd-wake

crates.io docs.rs MIT licensed

这是一个使用 systemd-run 来安排未来任务唤醒的实用程序库。

使用自定义的 systemd 单元名称作为预定任务的句柄。请注意,关于来自其他程序的命名冲突没有保证。选择名称时要明智。

虽然任何可以构建为 std::process::Command 的任务结构都是允许的,但这个工具是为了允许一个永久性的、但仅定期激活的任务使用 systemd 动态安排自己而创建的。

例如,如果程序知道它需要在未来的某个时间点做某事,它可以向 systemd-wake 注册并退出,同时释放资源,然后在 systemd 在预定时间唤醒它之前。然后程序可以在安排下一次唤醒时间并再次退出之前完成它需要完成的工作。

cron 作业最适合具有可预测调度的任务。这是为了填补只有运行时才知道的动态调度任务的空白。

systemd-run 的默认精度仅为 1 分钟,因此它不适用于需要小时间精度调度的任务。

安装

使用 cargo 安装

cargo install systemd-wake

现在将其添加到您的 Rust 项目中

cargo add systemd-wake

注意

systemd-wake 二进制文件是必需的,因为它用作预定 std::process::Command 和 systemd 之间的中介。

示例

use systemd_wake::*;

// one minute in the future
let waketime = chrono::Local::now().naive_local() + chrono::Duration::minutes(1);

// schedule a short beep
let mut command = std::process::Command::new("play");
command.args(vec!["-q","-n","synth","0.1","sin","880"]);

// create unit handle
let timer_name = TimerName::new("my-special-unit-name-123").unwrap();

// register future beep
systemd_wake::register(waketime,timer_name,command).unwrap();

// cancel future beep
systemd_wake::deregister(timer_name).unwrap();

待办事项

  • 基于计时器名称查询状态
  • 在安排具有相同名称之前检查现有单元
  • 在注销时返回已取消的命令和截止日期
  • 允许在不取消并重新构建命令的情况下重新安排任务
  • 允许恢复预定命令的 stdout、stderr 和退出状态

[^1]: 我不确定这个上下文会是什么?也许它只会被写入文件?

依赖关系

~2–3MB
~56K SLoC