Що не так з цими двома роботами у галузі керування?


13

У мене визначені наступні робочі місця в Cron.

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'

Здається, що він працює належним чином, якщо я запускаю його вищевказану команду безпосередньо з командного рядка. Але коли я перевірив виконання сценарію сьогодні вранці, мені надійшло повідомлення про електронну пошту (я перефразую, бо випадково їх видалив), що задні кліщі не були належним чином закриті.


FYI Я щойно перевірив роботу cron і отримав такі помилки. /bin/sh: 1: Syntax error: EOF in backquote substitution Для першої роботи з крон. /bin/sh: 1: Syntax error: Unterminated quoted string Для другої роботи з крон.
Марк D

2
З цієї причини зворотні посилання застаріли ; зміна на $(...)допоможе вам розібратися з питаннями цитування ...
jasonwryan

1
Ви обов'язково хочете перевірити моє питання. У ньому є відповідь Стефана Шазеласа, який пояснює, як ви можете створити інтерактивну оболонку, ідентичну середовищу, яку бачитиме ваша робота. Якщо ви пройдетеся через його маленьку процедуру, ви отримаєте підказку і зможете випробувати крок за кроком крок за кроком і побачити, де вона провалюється. unix.stackexchange.com/a/56503/16841 Впевнений, що це не 100% відповідність вашому запитанню, але це може допомогти вам вирішити проблеми із записом на кронтаб.
jippie

Відповіді:


14

Я настійно рекомендую розміщувати будь-які нетривіальні завдання cron у власному файлі скриптів оболонки з багатьох причин:

  • Простіше налагоджувати: ви можете просто запустити скрипт замість копіювання вставлення довгого рядка, а з правим рядком shebang він поводиться набагато передбачуваніше, ніж якби у вас були ті самі команди безпосередньо в crontab
  • Легше читати: не потрібно робити це однокласником на 200 символів, ви можете його добре відформатувати, щоб його легко читати та розуміти для всіх
  • Додайте скрипт до контролю версій

8
І поміщення проблемних %символів у сценарій не дозволить cronперетворити їх у нові рядки, що є вашою реальною проблемою.
Ян Д. Аллен

Я не погоджуюсь. Ви, як правило, забуваєте, який сценарій робить що. Я кажу з досвіду.
Шрідхар Сарнобат

30

Існує три загальні причини, коли команди cron поводяться по-різному в порівнянні з командами, введеними безпосередньо в інтерактивну оболонку, у грубому порядку спільності:

  • Cron забезпечує обмежене середовище, наприклад, мінімум $PATHта інші очікувані змінні відсутні.
  • Cron викликає /bin/shза замовчуванням, тоді як ви можете інтерактивно використовувати іншу оболонку.
  • Cron звертається до %персонажа спеціально (він перетворюється на новий рядок у команді).
  • Cron не забезпечує термінальне чи графічне середовище.

Ви повинні передувати всім %символам \у файлі crontab, який повідомляє cron просто ввести відсоток у команді. Пам'ятайте, що коли ви використовуєте dateкоманду в роботі cron.

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"

Я також виправив деякі проблеми цитування:

  • Це не викликало у вас інших проблем, ніж з розбірливістю, але ви не повинні використовувати задні команди для заміни команд. Використовуйте $(…)натомість: правила його розбору простіші.
  • Завжди використовуйте подвійні лапки навколо підстановок змінних та команд: "$somevariable", "$(somecommand)". Тут відсутність лапок була нешкідлива, оскільки dateкоманда ніколи не повертала жодного спеціального символу для використовуваних форматів, але ви повинні ретельно пам’ятати, які символи є спеціальними, і перевіряти це кожен раз, коли ви залишаєте заміну без котирування. Нехай це буде просто, завжди використовуйте подвійні лапки, якщо ви не хочете, щоб в результаті відбулося розщеплення полів та створення імен файлів.
  • У вас були окремі цитати, що запобігали розширенню навколо деяких підстановок команд. Використовуйте замість цього подвійні лапки.

0

Ви , здається , вкладені 'в muttкоманді:

"Події від date +%Y-%m-%d --date='last Wednesday'- date +%Y-%m-%d"

Спробуйте використовувати "замість внутрішнього, 'щоб вислів читався

"Події від date +%Y-%m-%d --date="last Wednesday"- date +%Y-%m-%d"


Я не впевнений, що це проблема. Але після того, як вистрілити в обох cron завданнях, виконавець без жодного успіху.
Марк D
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.