3

CRON の正規表現を記述するための最良の方法に関する推奨事項はありますか?

もう少しうまく説明させてください。CRON のフィールドに対応する個々の変数を含む構成ファイルがあります。各フィールドが有効であることを確認する必要があります。つまり、秒の場合は 0 ~ 59、月の場合は 0 ~ 31 などです。sed を使用して CRON を更新していますが、構成ファイルに構文エラー (偶発的な余分な文字、文字、CRON が好まないもの) がある場合、結果は悲惨なものになります (CRON ファイル)破壊されています)

考えられるすべての数字とワイルドカードを確認し、それ以外の場合はエラーをスローする必要があります。疲れているだけなのか、それとも何なのかはわかりませんが、これについて論理的に始めることはできないようです。

コーディングだけでなく、あらゆる提案を受け入れます。CRON が破壊されないようにする方法、おそらく個々の変数ではなく、CRON の 1 つの文字列 (構成ファイル内) ですべてを編集する

助けてくれてありがとう

これが構成の例です。とてもシンプルです。

# SUMMARY REPORT FREQUENCY ( * Wildcards acceptable )
MIN="30"
HOUR="*"
DAY="12"
MON="*"
WEEK="*"

* アップデート *

Bash 4.2.25 に同梱されている Ubuntu 12.04 LTS

これが更新を行っているコードです。

function REPORT.CHECK {
  sleep 1s
  if [ "`crontab -l | grep report.sh`" \> " " ]; then
    CTMP="$(set -f; crontab -l | grep report.sh)"
    if [ "$CTMP" = "$MIN $HOUR $DAY $MON $WEEK cd $DIR && ./report.sh" ]; then
      if [ "$DISABLE" = "false" ]; then
        RETURN="true"
      fi
    else
      if [ "$DISABLE" = "false" ]; then
        CTMPESC=$(sed 's/[\*\.&]/\\&/g' <<<"$CTMP")
        DIRESC=$(sed 's/[\*\.&]/\\&/g' <<<"$DIR")
        crontab -l | sed "s%$CTMPESC%/$MIN /$HOUR /$DAY /$MON /$WEEK cd $DIRESC \&\& \./report\.sh" | crontab -
        RETURN="update"
      fi
    fi
    if [ "$DISABLE" = "true" ]; then
      crontab -l | grep -F -v report.sh | crontab -
      RETURN="disable"
    fi
  else
    if [ "$DISABLE" = "true" ]; then
      RETURN="exit"
    else
      (crontab -l ; echo "$MIN $HOUR $DAY $MON $WEEK cd $DIR && ./report.sh") | crontab -
      RETURN="default"
    fi
  fi
}

このコードの抜粋は、実際にはかなりのことを行います。エントリが存在しない場合は、CRON に追加します。また、この部分(レポート部分)が構成で無効になっている場合はスクリプトを強制終了し(終了を返します)、CRONの内容が構成の内容と異なる場合はCRONを更新し、最後に構成が同一の場合CRONの内容まで、無視して先に進みます。これらの機能は適切ではありません。うまくいけば、それで十分な詳細が追加されます笑。

4

1 に答える 1

1

正規表現ベースのアプローチに固執している場合は、この一連の正規表現 (regeses?) から始める必要があります。曜日や月の名前の使用はサポートされておらず*/5every five minutes. しかし、これを試してください(設定ファイルをファイル id に開いていると仮定します$configfile

min=$(grep -P 'MIN="([0-5]?[0-9]|\*)"' $configfile | grep -oP '([0-5]?[0-9]|\*)')
hour=$(grep -P 'HOUR=\"([1-2]?[0-9]|\*)"' $configfile | grep -oP "([1-2]?[0-9]|\*)")
day=$(grep -P 'DAY=\"([1-3]?[0-9]|\*)"' $configfile | grep -oP "([1-3]?[0-9]|\*)")
mon=$(grep -P 'MON=\"(1?[0-9]|\*)"' $configfile | grep -oP "(1?[0-9]|\*)")
week=$(grep -P 'WEEK=\"([0-7]|\*)"' $configfile | grep -oP "([0-7]|\*)")

これらの値を収集したら、それらが正しい範囲内にあるかどうかを簡単に確認できます。たとえば、HOUR正規表現が と一致する可能性が29ありますが、これは明らかに実際の時間ではありません。しかし、値が保存されたので、次のことができます。

if [ "$hour" -gt 23 ]; then
  #throw an error, exit the test, whatever
fi

変数をテストするときは、必ず変数を引用符で囲んでください! たとえば、"$hour"ではありません$hour。変数にが*あり、それを引用しない場合、シェルはそれを現在のディレクトリ内のすべてのファイル名にインラインで展開します。

于 2013-08-03T19:39:23.357 に答える