为什么 cron 只提供分钟粒度?

为什么 cron 只提供分钟粒度?

感觉有些用例需要每 5 秒运行一次、每分钟运行两次等,但这些对于 cron 来说是不可能的。为什么现代操作系统中没有内置秒级 cron 粒度?(或者有,但我不知道……?)

答案1

简而言之,兼容性。

crontab 使用的格式有详细的描述作为 POSIX 规范的一部分。Linux 发行版通常不是 100% 完全符合 POSIX 规范,但它们通常非常接近,因为 POSIX 规范中的大多数内容都是开发人员认为理所当然存在的类 Unix 机器的一部分。就 Cron 而言,Linux 标准库更直接地指定它应该按照 POSIX 运行

当然,各个发行版可能会选择修改他们使用的 Cron,但添加秒级粒度需要另一个字段,这使得新的 crontab 实际上与几乎所有使用 Cron 的东西完全不兼容。

但是,指出这是为了兼容性并不能真正让我们了解为什么它只在分钟级别上细化。那么,为什么 Cron 一直使用分钟级粒度?

好吧,我当时还没有到那里(甚至还没有出生),但我怀疑这是因为Cron 最初实现的方式

版本 7 Unix 中的 cron 由 Brian Kernighan 编写,是操作系统进入多用户模式时从 /etc/inittab 调用的系统服务(后来称为守护进程)。它的算法很简单:

1.读取/usr/etc/crontab

2. 确定是否必须在当前日期和时间运行任何命令,如果是,则以超级用户 root 身份运行它们。

3.睡一分钟

4.从步骤1开始重复。

基于睡眠循环的 Cron 实现几乎肯定会在粒度小于一分钟的情况下崩溃;事实上,Cron 必须重写以使用更有效的方法,以便能够处理 100 个用户左右的负载。一秒粒度甚至比只有两个用户时更糟糕。

因此,由于程序最初无法处理它,并且由于格式一直延续,并且由于更改它将造成相当大的兼容性破坏,因此 cron 很可能永远不会支持亚分钟粒度。尤其是因为,正如 MichaelT 在评论中指出的那样,使用睡眠命令可以轻松创建所需的行为,而无需对 Cron 本身进行更改。

答案2

TL;DR

遇到了同样的疑问,并使用不同的(但常见的)方法解决了它(至少我认为是这样) - RTFM 哈哈

做一个man 5 crontab

您将阅读以下内容:

cron(8) examines cron entries every minute.

多一点

man 8 cron

There are two ways how changes in crontables are checked.
The first method is checking the modtime of a file.
The second method is using the inotify support. Using of inotify is logged in the /var/log/cron log after the daemon is started. The inotify support checks for changes in all crontables and accesses the hard disk only when a change is detected.

When using the modtime option, Cron checks its crontables' modtimes every minute to check for any changes and reloads the crontables which have changed. There is no need to restart Cron after some of the crontables were modified. The modtime option is also used when inotify can not be initialized.

相关内容