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