2013-08-03 5 views
3

Есть ли у кого-нибудь рекомендации по наилучшему методу написания регулярного выражения для CRON?Регулярное выражение Bash для CRON

Позвольте мне объяснить немного лучше. У меня есть файл конфигурации с отдельными переменными, соответствующими полям в CRON. Мне нужно проверить, что каждое поле действительно. т.е. 0-59 в секундах, 0-31 в течение месяцев и т. д. Я использую sed для обновления CRON, и если в файле конфигурации есть синтаксические ошибки (случайные дополнительные символы, буквы, все, что CRON не нравится), результаты являются катастрофическими (CRON-файл clabbered)

Мне нужно будет проверить все возможные числа и подстановочные знаки и выбросить ошибку на что-нибудь еще. Я не знаю, только ли я устал или что-то еще, но я не могу начать логично на этом.

Я открыт для любых предложений, а не только для кодирования. Как предотвратить CRON от получения затерт, может редактировать все в одной строке (в конфигурационном файле) для CRON вместо отдельных переменных

THx за любую помощь

Вот пример конфигурации. Очень просто.

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

* UPDATE *

Ubuntu 12.04 LTS, который поставляется с Bash 4.2.25

и здесь есть код, который делает обновление.

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, он просто игнорирует и движется дальше. Эти функции не в порядке. Надеюсь, что добавит достаточно подробного lol.

+0

какая ОС вы используете, что ваш crontab становится сбитым из-за плохих записей? И как вы редактируете/обновляете crontab? Мой опыт работы с crontab заключается в том, что неудачная запись, добавленная с помощью опции 'crontab -e', заставит отредактировать прервать, и файл вернется к своей предыдущей версии. Пожалуйста, не отвечайте в комментариях, но обновите свой вопрос с помощью этих важных деталей. Удачи. – shellter

+0

+1 для обновления вашего вопроса с полезными подробностями !. Вау, это довольно процесс. Почему бы не пройти в записи crontab, которую вы хотите проверить на функцию с именем 'entryValid (?)', Которая проверяет каждый '$ 1, $ 2, $ 3, ...' для правильных значений с помощью case case и возвращает 'true' или' ложь? 2 вещи. где определяется $ DIR (может быть, это не имеет значения)? 2. Зачем использовать backdkeys cmd sub, где вы четко знаете о '$ (.. cmd ..)' substitution? У вас явно есть умение решать это самостоятельно, искать здесь для '[bash] case regexp' (или регулярное выражение и другие варианты). Удачи. – shellter

+0

См. Мои комментарии выше. – Atomiklan

ответ

1

Если вы придерживаетесь подхода, основанного на регулярном выражении, этот набор регулярных выражений (regeces?) Должен начать вас. Он не поддерживает использование имен в течение дней недели или месяцев, а также «частотную» нотацию, такую ​​как */5, чтобы заменить every five minutes. Но попробуйте это (если вы открыли файл конфигурации в файл идентификатор $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. Если у вас есть * в переменной и не цитируйте ее, оболочка будет расширять ее в соответствии со всеми именами файлов в вашем текущем каталоге.

+0

См. Мои комментарии выше. – Atomiklan

Смежные вопросы