openSUSE:Cron 替换
[注意] 本文中的信息和提及的路径已过时,仅供历史参考。
目的或为什么需要替换 cron
目前我们的 默认 cron 守护进程 是 vixie-cron,该项目的上游看起来已经停止维护,并且我们的软件包中有 20 个补丁,没有机会将其推送到上游。这种状态会导致混乱,并且许多补丁使用不同的语法或风格。可能的解决方案是:创建我们自己的 openSUSE 分支并将其移动到 git 或 svn,或者切换到其他现有的较新的 cron 项目(bcron、fcron、cronie)并将我们的补丁与它们合并。切换到 cronie 似乎是最佳选择。Cronie 是从 vixie-cron 分叉而来,并且是 Fedora 中的默认 cron 守护进程。该项目的 git 仓库 是所有列出的 cron 项目中最活跃的仓库。它也是从 vixie-cron 分叉而来——因此代码库与 openSUSE 中的 vixie-cron 类似。
优缺点 - 切换到 cronie
缺点
- 可能导致不同的行为
- 来自 Fedora 的补丁可能不适用于 openSUSE
优点
- 来自 Fedora 的修复程序将应用于我们的发行版
- 版本控制、干净的软件包(没有旧补丁)
- cronie 还包含 anacron 项目
openSUSE vixie-cron 中的补丁
已包含在 cronie 中的 vixie-cron 补丁(已弃用)
- Makefile.diff
- pathnames.diff
- sprintf_misc.diff
- root-allowed.diff
- manpages.diff
- swapuids.diff
- stat-no-fstat.diff
- privilege_escalation.patch
- segfault.patch
- load_database.patch
- restrict_link_count.patch
- selinux.diff - cronie 已经包含对 selinux 的支持
- vfork_sigchld.diff
- crontab-permissions.diff - openSUSE 在 crontab 文件(/var/spool/cron/tabs/username)上使用 644 权限规则,Fedora 使用 600 规则,我们将迁移到更严格的 Fedora 规则
- sendasuser.diff - cronie 中有类似的实现
- syscrondir.diff - cronie 中有类似的实现
- remove_old_system.patch - cronie 中有类似的实现
未包含在 cronie 中的补丁(修复上游)
- pam.diff - pam_conv 函数应推送到 cronie(pam 配置不同)
- minuslog.diff - 该功能应推送到 cronie
未包含在 cronie 中的补丁(不适合上游)
- nheader_lines.diff - 处理 crontab 文件中的前三行注释
旧 openSUSE 的 cron 与新 openSUSE 的 cronie 之间的差异
切换到 cronie 后,默认 openSUSE cron 会发生什么变化?
- 我们将拥有 anacron 和 audit 支持
- 参见 syscrondir.diff,我们将迁移到 600 权限规则,用于每个 crontab 文件(/var/spool/cron/tabs/username)
- 旧的 'crontab' 命令在没有参数的情况下调用时会打印带有用法选项的消息并且不执行任何操作,新的 crontab 来自 cronie 等待 stdin 上的输入(等待输入新的 crontab 规则)
- Cronie 包含 inotify 支持,因此它可以有效地检测更改的 crontab 文件,并且 cron 不需要遍历所有 cron tab 文件,但另一方面,符号链接的 crontab 无法被 cron 守护进程自动注意到。cron 守护进程必须接收到 SIGHUP 信号才能重新加载 crontab。这是 inotify API 的限制。
- 旧的 cron 守护进程不允许在 crontab 用户标签(/var/spool/cron/tabs)中使用符号链接或硬链接,使用 cronie 可以这样做,可能不太安全(参见 bnc#258372 以获取相关讨论)
新 openSUSE 的 cronie 与 Fedora 的 cronie 之间的差异
/etc/crontab 和处理 sysconfig 选项
Fedora 和 openSUSE 使用系统 crontab 文件 /etc/crontab 来处理 cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/,但是方式不同。简而言之:Fedora 使用 /usr/bin/run-parts 脚本(它不是 cronie 软件包的一部分,而是 crontabs 软件包),而 openSUSE 的 cron 使用 /usr/lib/crons 脚本。两者都使用不同的技术:在 openSUSE 中,/usr/lib/crons 管理 cron.* 目录中所有脚本的启动,并使用 /etc/sysconfig/cron 中的一些 sysconfig 选项。这意味着如果我们不想在切换到 cronie 后破坏 cron 的 sysconfig ABI,我们必须仍然使用旧的 /usr/lib/crons 处理 - 但这没有问题,因为 cronie 源代码与此脚本没有绑定。其余 sysconfig 选项由安装 cron 服务使用的软件包中的文件使用,这些文件位于 cron.daily/ cron.hourly/ cron.monthly/ cron.weekly/,因此当我们切换到 cronie 时,我们也不会在这里破坏 sysconfig 选项
crontab 文件中的前三行注释
OpenSUSE 在每个 crontab 文件中放置三行注释
# DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.XXXXD6hhFw installed on Tue Dec 15 15:39:42 2009) # (Cron version V5.0 -- $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
当用户使用 crontab 命令编辑 crontab 规则时,这些行应该被隐藏。Fedora 不使用这些注释,因此 openSUSE cronie 必须应用补丁 nheader_lines.diff 来处理这种情况
其他差异
- cronie 在 Fedora 中使用 /var/spool/cron 存储用户的 crontab 文件,openSUSE cronie 使用 /var/spool/cron/tabs 存储这些文件
- cronie 在 openSUSE 中使用 /var/spool/cron/lastrun 文件存储上次运行的信息 - 这由 /usr/lib/cron/run-crons 提供(Fedora 不使用此脚本,参见上方)
我们将如何切换到 cronie
我们有更多可能性
我们将从 factory 中删除 cron(v4.1)软件包,并添加 cronie(v1.4.3)软件包,以使旧的 cron v4.1 过时(see cronie spec file in bs project)
Provides: cron = 4.2
Obsoletes: cron <= 4.1
- 这会带来很多问题,因为从 cron 切换到 cronie 实际上并不是软件包的更新,为了记住 runlevels 中的正确状态,我们必须做一些难看的技巧
cronie 源代码将放置在旧的 cron 软件包中(基本上我们可以说,旧的 cron 将更新到较新版本)
- 这不起作用,cronie 有 1.4.4 版本,而我们默认的 vixie-cron 有 4.1 zypper vcmp 1.4.4 4.1 显示:1.4.4 比 4.1 旧
因此,最终我们必须使用一些难看的技巧和子软件包,请阅读:https://en.opensuse.net.cn/Cron_rename#Example_of_proper_package_update
如何测试 cronie
现在我们设置了 cronie 的 bs 项目:Base:System 如果您很勇敢,并且安装了 openSUSE 11.2,只需添加 Base:System 仓库并安装 cronie
zypper ar http://download.opensuse.org/repositories/Base:/System/openSUSE_11.2/Base:System.repo zypper in cronie
您的旧 cron 守护进程将被删除