私は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)
。