![cron 如何工作?](https://linux22.com/image/1230896/cron%20%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我想编写一个大量使用的应用程序cron
。它将执行每分钟运行时间不到一秒的 Python 程序。
这句话的意思是:
*/1 * * * * python crtip.py parameters
我crontab -l
可以拥有吗?它是如何工作的?它会为每个计划作业分叉吗?
谢谢,
答案1
回答您的问题:
- crontab 可以有多少行?
我不知道 crontab 中的最大行数是多少。但是,超过几百行可能相当罕见(因此没有经过充分测试),而且也很难维护。所以我可能会避免超过这个数字。
- 它会为每个预定的作业分叉吗?
是的。
话虽如此,但cron
对于您描述的那种情况来说,它并不常用。如果您需要如此频繁地调用程序并使用如此多不同的参数,那么编写某种守护进程/服务器进程可能更合适。优点是:
- 很好,统一的日志记录(而不是将消息转储到 cron 的日志中或通过邮件发送)
- 更好地控制程序的运行时间(精度超过一分钟)
- 性能更高,因为你不需要总是在内部进行分叉
- 比巨大的 crontab 更容易维护/安装
也许您可以更详细地描述您需要多少次调用、使用哪些参数以及出于什么目的。这样我们才能更好地提供帮助。
答案2
以下是针对一个 cron 守护进程(dillon's cron (dcron))的答案,我目前是它的开发者。发行版中有各种各样的 cron 守护进程,答案也会有所不同。Vixie cron 可能是最广泛使用的;我不知道它的答案。
无论如何,对于 dillon 的 cron,用户可以在其 crontab 中拥有 256 条有效行(这可以在编译时配置)。Root 可以拥有比这多得多的行(我认为是 65535)。此外,root 可以拥有多个 crontab(/var/spool/cron/crontabs/root 中的一个,以及 /etc/cron.d/ 中任意数量的其他 crontab)。
Cron 命令每分钟只运行一次,在分钟开始时运行。您可以每分钟运行 60 个不同的命令,只需在它们前面加上sleep 1
,sleep 2
等。但我怀疑这是否是您心中的最佳解决方案。
是的,在我们的实现中,每个 cronjob 都会派生出一个单独的进程。如果有任何输出到 stdout 或 stderr,则会派生另一个进程来发送邮件。
答案3
是的,它会为每个 cronjob 分配一个分支。但是,如果您的服务器甚至功能强大,我认为您不会很快遇到任何问题。我的个人主页运行在非常老旧的 Pentium III 1.1 GHz / 512 MB RAM / 慢速 IDE HD 上,每小时运行大约 15 个不同的 cronjob 不会受到影响。
如果您的 cronjobs 非常耗 CPU 或 I/O,那么您的里程可能会有所不同,但“它们在不到一秒的时间内运行”部分让我认为您不会遇到任何问题。继续,如果时间告诉您这样做,请考虑一些更复杂的事情。
答案4
我遇到了类似的问题,必须在 crontab 中管理大量进程。我所做的就是编写一个主脚本,该脚本列出了某个文件夹(在命令行上提供)中的所有可执行文件和链接,并连续执行它们。我将此脚本与例如“monitor”参数一起放入 crontab,它将每分钟运行一次并执行“$BASEFOLDER/monitor”中的所有脚本。这样,您还可以让条目每小时、某些日子、早上一次、晚上一次启动……
我的主脚本所做的远不止这些,比如提供一组有保证的环境变量、统一日志记录和一些特定于应用程序的内容,但我希望您能理解。这有点类似于某些发行版使用的 cron.daily/cron.hourly 系统。