ОБРАТИТЕ ВНИМАНИЕ : Я прочитал все подобные вопросы повторно. cron, paths, env-переменные и так далее, но не нашли ни одного, который предлагал бы решения моей конкретной проблемы.
У меня есть скрипт, который делает некоторые дампы MySQL, а затем удаляет старые, как это:
/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete
( команда выше была изменена из моей первоначальной команды предложениями из комментариев )
Однако файлы никогда не удаляются, когда cron запускает этот скрипт. Пользователь cron - root.
Отладка заметок
Если я вручную запускаю сценарий, в котором появляется команда, он удаляет их, как и ожидалось.
Если я запускаю указанную выше команду find самостоятельно из командной строки от имени пользователя root, она удаляет их, как и ожидалось (и с параметром -print возвращает список файлов старше 5 дней, как и ожидалось)
Я также добавил явную инструкцию path в crontab root, но
это ничего не меняет.Cron не отправляет сообщение об ошибке, и если я передам операцию поиска в файл журнала, он
будет пустым или не будет создан вообще.Я использую сервер Ubuntu 14.04.03 LTS.
/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
cron
Команды запускаются через оболочку, а оболочка расширяет подстановочные знаки.cron
следует отправить письмо с выводом и сообщениями об ошибках. Вы получаете такое письмо от этой работы?Ответы:
Проблема в том, что
crontab
не$PATH
установлен во время работы. Вы можете указать путь к нему, добавив его в начало файла, открытого с помощьюcrontab -e
:(или что
PATH
вы предпочитаете использовать). Это означает, что вы можете не указывать полные пути к командам напрямую из cron.Есть несколько проблем с вашей исходной командой. Вы в основном просите, чтобы оболочка выполнила расширение подстановочного знака, а не
find
. Во-вторых, вы не предоставляете полный путьrm
; используйте/bin/rm
или/usr/bin/rm
, где бы он ни находился в вашей системе (см.which rm
).Первый аргумент для поиска - это «местоположение для поиска», а затем вы указываете «поисковый запрос» с различными
-<option>
s. Итак, правильный формат команды, которую вы хотите выполнить:или
Если вы не указали
PATH
определение, как указано выше, используйте:или
источник
$PATH
установить, но это будет система по умолчанию. Это будет включать/usr/bin
и/bin
, поэтому он должен быть в состоянии найтиrm
команду.Попробуйте это вместо
источник
-maxdepth 1
.Если я вызываю команду find непосредственно из корневого каталога root, а не как часть сценария, то она работает.
Рассматриваемый скрипт использует csh. Я считаю, что среда cron root в Ubuntu будет использовать / bin / bash (или / bin / dash?). Возможно, это как-то противоречит тому, как выполнялась команда find.
В любом случае, главный вопрос решен, хотя и несколько неуверенно.
источник