毎日午前10時から午後11時の間にcronを介してランダムにPythonスクリプトを実行します。

毎日午前10時から午後11時の間にcronを介してランダムにPythonスクリプトを実行します。

私はUbuntuを使用しており、毎日午前10時から午後11時の間にランダムにPythonスクリプトを実行する必要があります。現在は一定時間だけ実行しており、いくつかの例を見てきましたが、ほとんどは決まった時間内に繰り返し作業を行い、1日に1回だけ必要です。

最良のアプローチが何であるかについてのアイデアはありますか?

ありがとうございます!

答え1

cronランダム起動時間のサポートがわかりません。

ただし、任意の時間に実行するようにスクリプトをatスケジュールする利点を享受できます。python

0 10 * * * echo '"/path/to/my_script.py"' | at "now + $(shuf -i 1-780 -n 1)min"

sleepこれは、再起動後も持続するという点で、私が使用した以前のソリューションと比較して利点があります。

atqジョブがスケジュールされた時間を確認できます。

答え2

cronをまったく使用しないでください。システムタイマーこれには、次の組み込みオプションがありますRandomizedDelaySec

RandomizedDelaySec=
   Delay the timer by a randomly selected, evenly distributed amount of time between 0
   and the specified time value. Defaults to 0, indicating that no randomized delay shall
   be applied. Each timer unit will determine this delay randomly before each iteration,
   and the delay will simply be added on top of the next determined elapsing time, unless
   modified with FixedRandomDelay=, see below.

したがって、お客様の場合は、合計(= 13時間)OnCalendar=*-*-* 10:00:00を含むタイマーがあります。RandomizedDelaySec=46800バラよりAsk Ubuntuに関するこの記事またはArch Linux Wikiシステムタイマー設定の詳細。

答え3

毎朝10:00にジョブをスケジュールし、ランダムな時間(0秒から46800秒の間)ジョブを休止状態にしておきます。

ここで唯一の問題は、sleep "$(( RANDOM % 46800 ))"シェルのRANDOM変数(少なくとも場合bash)が0から32767の値を持つため、これを行うことができないことです。これは小さすぎます。

代わりにawk

awk 'BEGIN { srand(); print int(46800*rand()) }'

これは、次のスケジュールが利用可能であることを意味します。

0 10 * * * sleep "$( awk 'BEGIN { srand(); print int(46800*rand()) }' )" && mypythonscript

RANDOM別の方法はとにかく変数を使用することです。それから数秒離れているのではなく。興味のある時間範囲は正確に780分なので、次のように使用できます。

SHELL=/bin/bash

0 10 * * * sleep "$(( 60*(RANDOM % 780) ))" && mypythonscript

これは、Pythonスクリプトを使用しない限り、1分間だけ起動されることを意味します。RANDOM 再び60上記の内容をランダムに(RANDOM % 60)

関連情報