Команды заданий cron ведут себя по-разному по сравнению с командами, введенными непосредственно в интерактивную оболочку, в грубом порядке:
- Cron предоставляет ограниченную среду, например, минимальную
$PATH
, а другие ожидаемые переменные отсутствуют.
- Cron вызывается
/bin/sh
по умолчанию, тогда как вы можете использовать какую-то другую оболочку в интерактивном режиме.
- Крон обрабатывает
%
персонажа специально (он превращается в новую строку в команде).
- Cron не предоставляет терминальную или графическую среду.
Вы должны предшествовать всем %
символам \
в файле crontab с символом a , который говорит 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
команда никогда не возвращала никаких специальных символов для используемых вами форматов, но вы должны тщательно помнить, какие символы являются специальными, и проверять это каждый раз, когда оставляете подстановку без кавычек. Проще говоря, всегда используйте двойные кавычки, если вы не хотите, чтобы в результате происходило разбиение поля и генерация имени файла.
- У вас было несколько одинарных кавычек, препятствующих расширению вокруг некоторых подстановок команд. Вместо этого используйте двойные кавычки.
/bin/sh: 1: Syntax error: EOF in backquote substitution
Для первой работы cron./bin/sh: 1: Syntax error: Unterminated quoted string
Для второй работы cron.