Назад | Перейти на главную страницу

find -delete работает нормально, но не cron

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: Я прочитал все похожие вопросы по поводу. cron, paths, env variables и т. д., но не нашли ни одного, предлагающего решения моей конкретной проблемы.


У меня есть сценарий, который создает дампы MySQL, а затем удаляет старые, например:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

(приведенная выше команда была изменена по сравнению с моей исходной командой предложениями из комментариев)

Однако файлы никогда не удаляются, когда cron запускает этот сценарий. Пользователь cron - root.

Примечания к отладке

Проблема в том, что 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.

Так или иначе, главную проблему он решил, хотя и несколько неэлегантно.