編集する:私はこれを自分で見つけることができ、プロセスが少し複雑だったので、実際に元の質問を削除しましたが、他の人が役に立つと思う場合に備えて後で答えました。 RegExpは主に数値ベースの結果を処理するため、この場合は必要ありません。
元の質問:
write_cronjob()
渡されたジョブがすでに存在することを確認したり、grep基準で一致するものが見つからない場合は、crontabに書き込む機能があります。
一部のネットワーク制限により、cronjobは特定のウィンドウでのみ予約できます。ユーザーはスケジュールを自由に設定できるため、定義されたウィンドウの外でスケジュールしようとする操作は実行されないため、スクリプトはそれを検出する必要があります。
この関数には2つのパラメータがあります。
$1
- cron計画のみを含みます。0 19 * * 3
$2
- 実行するジョブ/コマンドが含まれています。
必要に応じて書き込み操作の前にマージされます。
クローン予約ルールは、次の基準を満たす必要があります。
- 月曜日~金曜日(平日)
- 午前7時(午前07:00) - 午後10時(午後22:00)
日中の部分の範囲を確認しようとしていますが、時間部分は24時間制(22=午後10時)を使って少し難しいです。
私の要件は次のとおりです
$1
条件付き検証のためにcronjobの時間と日付の部分を選択するように分割できます。- RegExpモード/範囲は、分割された部分をチェックして基準を超えているかどうかを検出し、
exit 1
それに応じて確認します。
メモ:
私のシェルはash(BusyBox)であり、配列は使用できません。
答え1
$1
awkを使用して、時間と日付の部分を分割して抽出できます。デフォルトの区切り文字は空白なので、cronjobの時間値をうまく分割します。
次の例の値$1
:0 19 * * 1-5
CRONJOB_HOUR=$(echo "$1" | awk '{ print $2 }') # Second position: 19
CRONJOB_DAY=$(echo "$1" | awk '{ print $5 }') # Fifth position: 1-5
これらの部分を変数に入れて条件付きチェックを実行できます。
最初の確認は、範囲を作成するための確認より小さいか大きいです。
if [ "${CRONJOB_HOUR}" -lt 7 ] || [ "${CRONJOB_HOUR}" -gt 22 ] ; then
echo "Cronjob cannot be scheduled within specified hour"
exit 1
fi
2 番目の条件は、1 から 6 などの値を取得するのではなく、一致に基づいて実行されます。
if [[ "${CRONJOB_DAY}" == *"6"* ]] ||
[[ "${CRONJOB_DAY}" == *"7"* ]]
then
echo "Cronjob cannot be set to run at weekends"
exit 1
fi