Лучшие практики для поддержки cronjobs и сценариев оболочки?

Я унаследовал разросшийся crontab, который мне нужно поддерживать и обновлять. У меня нет большого опыта в этом или написании сценариев bash (я думаю, что хорошо разбираюсь в основах), и я хочу делать хорошую работу. Краткий запрос: какие-либо рекомендации по «рефакторингу» запутанного crontab и набора скриптов bash.

Длинный запрос: я столкнулся с рядом проблем, но так много людей используют файлы cron и т. д., что я чувствую, что мне не хватает какого-то большого хранилища информации, лучших практик и инструментов - или это просто стилистическая разница для этого вид программирования? (Мое предубеждение: зачем делать что-то вручную, если я могу использовать инструмент, чтобы сделать это быстрее, последовательно и хорошо?).

Примеры проблем на данный момент:

  1. Из-за внешнего события crontab не запускался пару дней. Вместе с кем-то мы вручную прошлись по списку, пытаясь выяснить, что не запустилось, что нам нужно было перезапустить, какие скрипты нам нужно было отредактировать и запустить с более ранними датами и т. д. Что я не могу найти:

    • There are plenty of (slightly pointless) 'cron generators' online. Where are the reverse? Something I can feed in a long crontab, two dates, and have it output which processes should have run when, or just how many times total? This seems within my meager scripting capabilities, so shouldn't it exist already? ;)
    • В качестве альтернативы, если мне когда-нибудь придется делать это снова, есть ли способ вызвать bashscript, чтобы любые экземпляры date() были предварительно установлены на более раннее время, а не меняли каждый вызов даты в скрипте? (например, для всех пропущенных отчетов и счетов-фактур)
  2. Оказывается, конкретный отчет не публиковался два года. Его только что снова запросили, и вот оно в crontab! Сценарий bash только что имел неверные ссылки на пути к соответствующим файлам. Чего я не могу найти: какую-то программу проверки пути для файлов bash? Как проверка ссылок на сайт. Да, в конце концов я пройду через все это вручную, но это покажет, по крайней мере, некоторые проблемные области.

  3. Иногда кажется, что между зависимыми процессами был либо слишком длинный, либо короткий промежуток, поэтому обновления происходили после запуска первого или первый не заканчивал работу до того, как был вызван второй. Я видел несколько возможных вариантов для этого (например, anacron запускается в последовательном порядке), но что бы вы порекомендовали?

  4. Существует также большое количество практически бессмысленных электронных писем, сгенерированных из crontab (скрипты, выдающие ошибки, но работающие «правильно», сбои в основном молча или просто печатающие каждый шаг несущественных скриптов). Я буду вручную просматривать сценарии и пытаться заставить их предоставлять больше полезных данных или «тихо добиваться успеха», но, знаете, какие-нибудь рекомендации?

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


person Azazo    schedule 13.04.2011    source источник


Ответы (2)


Не полный ответ, а дополнительные полезные ресурсы: http://blog.endpoint.com/2008/12/best-practices-for-cron.html

Я потихоньку прохожу через это, и пытаюсь реализовать каждый из пунктов. Я не думал гуглить «лучшие практики cron» до моего поста. :П

Для управления версиями я пока собираюсь использовать RCS, так как редактирую скрипты пофайлово, но мне посоветовали настроить Git (или Mercurial, если я работал в системе Windows). ).

Звучит здорово: http://everythingsysadmin.com/2010/09/xed-202-released.html «xed — это perl-скрипт, который блокирует файл, запускает $EDITOR для файла, а затем разблокирует его»… и помещает его в RCS, если это еще не было сделано. Полностью безмозглый контроль версий. Если я разберусь с bash, я хотел бы создать ярлык редактирования, который автоматически фиксирует любую систему контроля версий, которую я использую.

Другие советы, которые я получил от системного администратора, Даты: вместо того, чтобы использовать, скажем, дату или --date="последний понедельник", используйте фиксированную дату и добавляйте к ней день/неделю и т. д. каждый раз, когда она запускается (если не более текущий день, очевидно), потому что тогда, если скрипт не запускается, я могу просто перезапускать скрипт несколько раз, пока он не наверстает упущенное. Ах! (И это может показаться очевидным, но куча отчетов, которые я буду редактировать, не говорите явно, за какие даты работает отчет. Исправим.)

И меня заверили, что я должен попытаться сделать электронные письма cron как можно более тихими, чтобы я действительно заметил, есть ли электронное письмо с ошибкой. Существуют оболочки для улучшения отчетов об ошибках cron, которые я еще не исследовал, ссылки здесь: http://habilis.net/cronic/

person Azazo    schedule 18.04.2011

Перед вами стоит сложнейшая задача, удачи. :)

Я бы предложил найти все задачи, которые выполняются ежедневно, и запихнуть их в свои скрипты в /etc/cron.daily/. То же самое для недели в /etc/cron.weekly, часа и месяца.

Возможно, вы захотите изучить использование anacron(8) для планирования ваших заданий, если машина не всегда будет подключена к сети, но вам все же нужен некоторый уровень контроля над запуском заданий. Это был cron-helper-tool по умолчанию для нескольких дистрибутивов в течение нескольких лет, так что, надеюсь, он достаточно стабилен, чтобы полагаться на ваши собственные задачи; но я легко мог себе представить, что это может не совсем соответствовать вашим потребностям.

Подделать даты для скриптов можно как минимум с двумя пакетами в Ubuntu: datefudge и faketime. У меня нет опыта ни с тем, ни с другим, но оба звучат так, как будто они должны быть в состоянии помочь. Надеюсь, в будущем он вам не понадобится. :)

Извините, я не знаю средства проверки пути для bash-скриптов. Это кажется маловероятным, поскольку простые скрипты просты и их легко проверить на глаз :), а сложные скрипты все равно будут генерировать свои пути во время выполнения. Возможно, вы могли бы вести базу данных путей, используемых каждым сценарием, и написать новый сценарий для регулярной проверки этой базы данных.

Вы можете отключить электронную почту cron, установив MAILTO="". Я не уверен, что мне это нравится. Возможно, установка MAILTO на учетную запись только для ведения журнала поможет справиться с потопом. Другой вариант — хорошо изучить свои procmail(1) правила, чтобы полностью запихнуть их в другой почтовый ящик.

Умение управлять mutt color или score поможет вам обнаружить зерна среди плевел. (color index red black ERROR или подобные команды могут помочь вам быстрее обнаружить проблемы.)

person sarnold    schedule 13.04.2011
comment
Спасибо за совет. Обнадеживает хотя бы! Извините, я не знаю средства проверки пути для bash-скриптов. Кажется маловероятным, так как простые скрипты просты и легко проверяются на глаз :) Хахахахаха! Ну что ж. ;) Mutt в настоящее время сводит меня с ума (электронная почта в формате HTML? Легко. Csv, прикрепленный к электронной почте? Легко. И то, и другое? Смешно!), так что мне все равно нужно лучше научиться справляться с этим. - person Azazo; 19.04.2011