SVN | awk | почта работает в bash, а не в cron

У меня есть следующая команда, чтобы показать изменения в хранилище Subversion

svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com

Он отлично работает в командной строке.

Когда я вставляю его в crontab, я получаю следующее сообщение об ошибке:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `)'
/bin/sh: -c: line 1: syntax error: unexpected end of file

Как это должно быть указано для работы?

2 ответа

Решение

При использовании cron избегайте таких проблем, помещая все в сценарий оболочки, а затем вызывайте сценарий оболочки из cron.

Этот подход обычно используется и хорошая идея, потому что:

  • Это делает вашу команду легко тестируемой (вам не нужно делать глупости, например, планировать выполнение за одну минуту)
  • Легко вызывать вручную, если необходимо, например, в случае сбоя задания, операции могут быть перезапущены без прикосновения к crontab - также задания могут быть вызваны из других заданий, например, окончательное задание, которое проверяет, все ли задания выполнено и выполняет их повторно. это не
  • Он отделяет то, что исполняется, от того, когда он выполняется - оставляя cron делать (только) то, что он делает лучше всего: планирование
  • Это дает вам полный доступ к функциям сценария оболочки или с использованием различных оболочек, таких как perl
  • Содержит crontab в чистоте и легко читается
  • Любой, кто разрабатывает / поддерживает задачи cron, знает, где искать, если вы используете согласованный каталог для задач cron (например, / opt / cron или любой другой)
  • Вы можете поставить свои задачи cron под контроль исходного кода - слишком часто сценарии оболочки игнорируются для контроля исходного кода, но они представляют собой код и, следовательно, получают выгоду от контроля исходного кода.

Например:

dosomething.sh:

svn log -v -r{$(date +%Y-%m-%d)}:HEAD http://therepository | awk '/^r[0-9]+ / {user=$3} {if (user=="username") {print $1 $2 $3}}' | mail -ne -s'Users SVN commits' email@email.com

плюс

cron 0 22 * * * /opt/cron/dosomething.sh

Проще всего было бы сохранить это как скрипт bash, а затем запустить скрипт из cron.

(Я бы сделал это комментарием, а не ответом, но ТАК не позволит мне комментировать)

Джо

Другие вопросы по тегам