現在、他のプロトコルに対してメモリ集約的な呼び出しを実行する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
答え2
別のオプションは、次のものを使用することですat
。
at -f script 16:44 + 5 days
script
リストされたコマンドは、5日後の午後4時44分に実行されます。
この機能を使用すると、作業スケジュールを自動的に変更できるようにして、5日ごとに作業スケジュールを設定できます。ジョブで何が起こっても5日後に再度実行されるようにするには、これを最初に実行する必要があります。
script
シェルコマンドを含める必要があるため、Perlスクリプトへの呼び出しを含める必要があります。at
Perlスクリプトへの直接呼び出しを要求できません。ジョブはat
そのジョブを最初に呼び出したユーザーとして実行されるため、at
適切なユーザーとして最初に実行する必要があります(チェーンを開始するには手動呼び出し)。
次のスケジュールされたタスクをキャンセルしてチェーンを停止するには、次のようにその識別子を見つけます。
atq
で削除してくださいatrm
。