感觉有些用例你希望每 5 秒运行一次,每分钟运行两次,等等,但是这些对于 cron 来说是不可能的。为什么现代操作系统没有内置二级 cron 粒度?(或者有它而我不知道..?)
小智 17
简而言之,兼容性。
crontab 使用的格式作为 POSIX 规范的一部分进行了详细描述。Linux 发行版通常不是 100% 完全符合 POSIX 规范,但它们通常非常接近,因为 POSIX 规范中的大部分内容都是开发人员认为理所当然的类 Unix 机器的一部分。就 Cron 而言,Linux Standard Base相当直接地指定它应该按照 POSIX 运行。
当然,个别发行版可能会选择修改他们使用的 Cron,但是添加二级粒度需要另一个字段,这使得新的 crontab 实际上与使用 Cron 的几乎所有内容完全不兼容。
但是,指出它是为了兼容性并没有真正让我们了解为什么它只在分钟级别上进行细化。那么,为什么 Cron 总是使用分钟级粒度?
好吧,我并不完全在那里(当时甚至还没有出生),但我怀疑这是由于Cron 最初实施的方式。
Unix 7 版中的 cron 由 Brian Kernighan 编写,是当操作系统进入多用户模式时从 /etc/inittab 调用的系统服务(后来称为守护进程)。它的算法很简单:
1.读取/usr/etc/crontab
2.确定是否有任何命令必须在当前日期和时间运行,如果是,请以超级用户 root 身份运行它们。
3.睡一分钟
4.从步骤1重复。
基于睡眠循环的 Cron 实现几乎肯定会以比一分钟更细的粒度崩溃;实际上,必须重写 Cron 以使用更有效的方法,以便能够处理 100 个用户数量级的负载。一秒的粒度甚至比只有两个用户的粒度还要糟糕。
因此,因为程序最初无法处理它,并且因为格式一直在继续,并且因为更改它会导致相当大的兼容性中断,所以 cron 很可能永远不会支持亚分钟粒度。特别是因为,正如 MichaelT 在评论中指出的那样,使用 sleep 命令可以轻松创建所需的行为,而无需更改 Cron 本身。