每 5 天重复一次 Perl 脚本,而不是每月的第 n 天

每 5 天重复一次 Perl 脚本,而不是每月的第 n 天

我目前有一个 perl 脚本,用于对另一个协议进行内存密集型调用。这大约需要 20-25GB 内存才能完成。并且,它需要 8 到 15 分钟。完成后,我将数据导出到另一个 perl 脚本中,该脚本会处理它并提交给我的 discord 机器人。

我遇到的问题;

我需要每 5 天运行一次此代码。不是每周或每月的第 5 天,而是每 5 天一次。该协议每 5 天就会提供一次新信息。

如果我使用 perl1 调用 perl2 并让 perl2 休眠 431000 秒(减去涉及 perl2 所需的时间),然后再次调用 perl1,这是一个糟糕的计划吗?

我开始想,当 p1 调用 p2 和 p2 a 再次调用 p1 时,我可能会打开很多 perl 进程。我什至不确定我是否可以睡 5 天,否则这个过程就会自行结束。我知道有更好的方法可以做到这一点。

调查 cron,我无法想出或发现任何与场景真正匹配的内容。

假设时间是 10 月 20 日下午 4:44。下一个数据将于 10 月 25 日下午 4:44 提供,然后是 30 日、11 月 4 日,依此类推。

时间不会改变。时间总是下午 4:44。我不知道实现此目标的最安全/最有效的方法。我已经用 8GB 交换来读取我的 16GB RAM 系统,以按原样读取协议数据,我不希望无休止的进程运行占用额外的资源。

服务器在Ubuntu上

谢谢

答案1

cron对于这种事情并不是那么灵活,一次睡五天在几个方面并不是完全可靠的。

一种解决方案是将“每五天”逻辑烘焙到包装脚本中,并将其设置cron为每天运行。所以这样的方法是一种:

unix_day=$(($(date +%s) / (60*60*24)))
modulus=$((unix_day % 5))
[ "${modulus}" -eq 0 ] && perl yourScript.pl

这是确定性的,它将根据纪元以来的天数每 5 天运行一次。

如果您想以特定的一天作为 5 天的基础,那么这应该可以做到。在此示例中,神奇的开始日期是 2022 年 10 月 13 日(昨天) - 您应该根据您的用例进行设置

my_epoch=$(($(date -d"2022-10-13 04:44" +%s) / (60*60*24)))
unix_day=$(($(date -d 04:44 +%s) / (60*60*24)))
modulus=$(((unix_day - my_epoch) % 5))
[ "${modulus}" -eq 0 ] && perl yourScript.pl

答案2

另一种选择是使用at

at -f script 16:44 + 5 days

script将在五天后的下午 4:44运行列出的命令。

您可以使用此功能通过让作业自行重新安排来每五天安排一次作业。这应该是它做的第一件事,这样无论作业中发生什么,它都会在五天后再次运行。

script必须包含 shell 命令,因此它应该包含 Perl 脚本的调用;你不能要求at直接调用你的 Perl 脚本。该作业将以at首先调用的用户身份运行,因此您应该at以适当的用户身份运行第一个(启动链的手动调用)。

如果您想通过取消下一个计划作业来停止链,请使用以下命令找到其标识符

atq

并用 删除它atrm

相关内容