毎月n日目ではなく、5日ごとにPerlスクリプトを繰り返します。

毎月n日目ではなく、5日ごとにPerlスクリプトを繰り返します。

現在、他のプロトコルに対してメモリ集約的な呼び出しを実行するPerlスクリプトがあります。これを完了するには、約20〜25 GBのメモリが必要です。そして時間は8〜15分かかります。完了したら、データを処理し、私のDiscordボットに送信する別のPerlスクリプトにデータをエクスポートします。

私が経験した問題。

このコードは5日ごとに実行する必要があります。毎週5日や毎月5日ではなく、5日ごと。プロトコルは5日ごとに新しい情報を提供します。

perl1を使用してperl2を呼び出し、perl2を431000秒(perl2を含めるのにかかる時間を除く)の間、スリープモードにしてから再びperl1を呼び出すと、これは悪い計画ですか?

私はp1がp2を呼び出し、p2がp1を再び呼び出すと、多くのPerlプロセスが開いている可能性があると考え始めました。 5日間眠ることができるのか、それともプロセスが自然に終わるのかさえわかりません。私はこれを行うより良い方法があることを知っています。

cronを調べてみても、シナリオと実際に一致するものが思い出したり見つかりません。

時間が10月20日午後4時44分だとしましょう。次のデータは10月25日午後4時44分に公開され、その後30日、11月4日などで公開されます。

時間は変わりません。時間はいつも午後4時44分。私はこれを達成する最も安全で効率的な方法を知りません。プロトコルデータをそのまま読み取るために、16 GBのRAMシステムで8 GBのスワップを使用しました。無限のプロセスが追加のリソースを占有しながら実行されることを望まない。

サーバーはUbuntuにあります

ありがとう

ベストアンサー1

cronこの種の仕事にはあまり柔軟ではないので、一度に5日間眠るのは、いくつかの点で完全に信頼できません。

1つの解決策は、「5日ごと」のロジックをラッパースクリプトに書き込み、毎日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

おすすめ記事