#cron #systemd #generator #systemd-unit #generate

app systemd-crontab-generator

支持crontab文件的系统d生成器

10个版本 (3个稳定版)

使用旧的Rust 2015

1.0.2 2016年6月8日
1.0.1 2016年4月21日
1.0.0-rc72016年3月28日
1.0.0-rc62016年1月4日
1.0.0-rc52015年12月28日

#458 in Unix API

每月 28 次下载

MIT 许可证

52KB
961

systemd-cron-next

Travis Crate Crate

这是什么?

这是一个cron-to-systemd定时器框架的兼容层。它通过解析来自通常位置(如/etc/crontab/var/spool/cron)的crontab和anacrontab文件,生成systemd定时器和服务。您可以使用cron.target作为生成单元的单个控制点。

它旨在作为所有cron实现的直接替代品。

理由

systemd的crontab生成器(用C实现)已在邮件列表中发布,但后来被Lennart拒绝

我不太相信这是一个真正的好主意。至少从我的角度来看,我们最好只转换crontab,这样就足够了。与sysv init脚本不同,crontab的使用数量(至少在Fedora上)相对较小,在第三方包中非常罕见。

Lennart

虽然我一般同意他的观点,但我并不完全确信总是方便地将大量的*.timer*.service文件放在一起。我发现将所有任务调度在单个文件中更方便,如果你一次能看到多个任务,那么任务调度的关系也更明显。

综合考虑,我认为人们应该有一个替代方案,所以我决定支持systemd crontab生成器的想法。尽管邮件列表中原始的crontab解析器C实现非常不完整:它不支持单调调度(如@daily@yearly),它无法解析注释和环境变量设置等。

因此,我决定创建systemd-crontab-generator

历史

我在C语言方面并不擅长,因此C语言的实现(尽管它对于生成器来说是推荐的)将花费我很多时间,所以最初,我使用Python进行概念验证实现。然后我的小型家庭项目被@systemd-cron项目注意到,最终被合并到其中,并得益于Alexandre DetisteDwayne Bent和其他人的帮助而发展起来。

然而,我心中仍然想着项目的未来:用系统语言重写它。Python作为基于虚拟机的脚本语言,并不是系统服务的最佳选择:它运行缓慢(实际上是运行速度最慢的系统生成器),存在多线程问题,需要许多像setgid/setuid C助手这样的黑客手段来实现crontab,等等。

与此同时,我非常喜欢从开始就使用的Rust系统语言,它已经达到了1.0版本,所以我决定抓住这个机会,将所有内容都用Rust重写。

你现在看到的当前版本是@systemd-cron的继任者。该项目完全用Rust从头开始重写,同时保留了经验,systemd单元模板以及由@systemd-cron团队在Python版本中精心打磨的主要算法和解决方案。

使用方法

生成器在系统启动时以及crontab更改时运行。

项目包括简单的crontab命令等效物,其行为类似于标准crontab命令(并接受相同的选项)。

安装后,将可执行脚本添加到适当的cron目录中(例如/etc/cron.daily),并启用systemd-cron。

# systemctl daemon-reload
# systemctl enable cron.target
# systemctl start cron.target

现在这些脚本应该由systemd自动运行。有关更多信息,请参阅man:systemd.cron(7)。

要进一步控制cron作业,请使用cron.target单元。

依赖关系

  • systemd ≥ 197
    • systemd ≥ 209,年度定时器
    • systemd ≥ 212,持久定时器
    • systemd ≥ 217,分钟、季度和半年定时器
    • systemd ≥ 229,支持使用RandomizedDelaySec选项的真正随机延迟
  • run-parts
  • /usr/sbin/sendmail(可选,在运行时评估)

安装

如果您使用的是Archlinux,可以从AUR安装,否则请参阅PKGBUILD文件,并从package()子目录执行命令。

打包

构建

$ ./configure
$ make

您需要Rust稳定编译器(已使用1.5.0进行测试)和cargo工具来构建项目。

暂存

$ make DESTDIR="$destdir" install

配置

configure脚本接受命令行参数来配置构建的各种细节。以下选项遵循标准GNU 安装目录

  • --prefix=<路径>
  • --bindir=<路径>
  • --confdir=<路径>
  • --datadir=<路径>
  • --libdir=<路径>
  • --statedir=<路径>
  • --mandir=<路径>
  • --docdir=<路径>

其他选项包括

  • --unitdir=<path> 系统单元文件的路径。默认值:<libdir>/systemd/system
  • --runpaths=<path> 指定 run-parts 可执行文件应使用的路径。默认:<prefix>/bin/run-parts
  • --enable-boot[=yes|no] 包含对启动定时器的支持。默认:yes
  • --enable-minutely[=yes|no] 包含对分钟定时器的支持。需要 systemd ≥ 217。默认:no
  • --enable-hourly[=yes|no] 包含对小时定时器的支持。默认:yes
  • --enable-daily[=yes|no] 包含对每天定时器的支持。默认:yes
  • --enable-weekly[=yes|no] 包含对每周定时器的支持。默认:yes
  • --enable-monthly[=yes|no] 包含对每月定时器的支持。默认:yes
  • --enable-quarterly[=yes|no] 包含对每季度定时器的支持。需要 systemd ≥ 217。默认:no
  • --enable-semi_annually[=yes|no] 包含对半年定时器的支持。需要 systemd ≥ 217。默认:no
  • --enable-yearly[=yes|no] 包含对每年定时器的支持。需要 systemd ≥ 209。默认:no
  • --enable-persistent[=yes|no] 使定时器持久化。需要 systemd ≥ 212。默认:no
  • --enable-randomized-delay=[yes|no]RANDOM_DELAY 支持使用 RandomizedDelaySec 选项。需要 systemd ≥ 229。默认:yes

最新 systemd 的典型配置为

$ ./configure --prefix=/usr --confdir=/etc --enable-yearly --enable-persistent

如果您只需要生成器(您需要提供自己的 /etc/crontab 以驱动 /etc/cron.daily/ 等...)

$ ./configure --enable-boot=no --enable-hourly=no --enable-daily=no --enable-weekly=no --enable-month=no --enable-persistent --prefix=/usr --confdir=/etc

注意事项

您的软件包在启动 cron.target 之前还应运行这些额外命令,以确保 @reboot 脚本不会立即触发

# touch /run/crond.reboot
# touch /run/crond.bootdir

另请参阅

systemd.cron(7) 或在源代码树中 man -l src/man/systemd.cron.7

免责声明

这是一个测试版产品!使用风险自担!我对任何由于使用或误用此项目而导致的数据丢失、时间损失、金钱损失或其他故障不承担责任!我已经在我的本地服务器上运行了数月,没有问题,但这并不意味着您也不会有问题!不要因为产品的崩溃而责怪我!您已被警告!

许可

项目的主体部分根据 MIT 许可。Crontab 手册页是从 Vixie Cron 衍生而来,并使用 Paul-Vixie's-license 许可。

贡献

非常欢迎您提交错误Pull Request!还可以查看AUR中关于Arch包状态的最新消息评论

原始 @systemd-cron 项目

  • © 2013-2014 Dwayne Bent
  • © 2013 Dominik Peteler
  • © 2014 Daniel Schaal [email protected]

Systemd crontab生成器进化、工具和支持

原始systemd crontab生成器Python代码,Rust版本

Systemd crontab生成器man页面(man/systemd-crontab-generator.8.in

Crontab man页面(man/crontab.5.in

Debian打包

依赖关系

~6MB
~112K SLoC