find -delete працює добре, але не з cron


10

УВАГА : Примітка : я прочитав усі подібні запитання повторно. cron, paths, env змінні тощо, але не знайшли жодної, яка б запропонувала рішення для моєї конкретної проблеми.


У мене є скрипт, який робить деякі демпінги MySQL, а потім видаляє старі такі:

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

( вищевказана команда була змінена з моєї оригінальної команди на підставі пропозицій із коментарів )

Однак файли ніколи не видаляються, коли cron запускає цей сценарій. Користувач cron є root.

Налагодження приміток

  • Якщо я вручну запускаю скрипт, в якому з’являється команда, він видаляє їх, як очікувалося.

  • Якщо я запускаю вищезазначену команду find самостійно з командного рядка як корінь, вона видаляє їх як очікувалося (і за допомогою -print вона повертає список файлів старше 5 днів, як очікувалося)

  • Я також додав явний конверт шляху до crontab root, але
    це нічого не змінює.

  • Cron не надсилає помилок, і якщо я передаю операцію пошуку в файл журналу, він
    з’являється порожнім або взагалі не створюється.

  • Я використовую сервер Ubuntu 14.04.03 LTS.


Я б уникну розширення підстановки (наприклад, * .gz) в шляху. cron може інтерпретувати як * .gz, не розширюючи всі файли gz.
Архемар

Який результат ви отримуєте, якщо виконати завдання без дії/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
user9517

@Archemar Чому підказки не розширяться? cronкоманди виконуються через оболонку, а оболонка розширює символи.
Вармар

cronповинен надсилати електронну пошту із повідомленнями про вихід та помилки. Чи отримуєте ви такий електронний лист від цієї роботи?
Вармар

@Iain це працює як очікувалося.
TommyPeanuts

Відповіді:


6

Проблема в тому, що 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>s. Отже, правильний формат команди, яку ви хочете виконати:

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

1
Це повинно було $PATHвстановитись, але це буде типовою системою. Це буде включати в себе /usr/binі /bin, таким чином, вона повинна бути в змозі знайти rmкоманду.
Вармар

Тому я спробував поставити $ PATH у crontab (хоча, як це було зазначено в іншому місці, він, ймовірно, за замовчуванням до системного шляху, якщо не зазначено), і переконався, що все має повний шлях. Я також використовував -name "* .gz" замість підстановки на шляху пошуку. Але нічого не відбувається. Команда просто не запускається, і помилок не викинуто.
TommyPeanuts

3

Спробуйте це замість цього

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete

Навіщо ви перенаправляєте stderr у файл? За замовчуванням він буде надісланий електронною поштою, якщо був вихід.
kasperd

Так, це правда, що за замовчуванням надсилається будь-яке повідомлення електронною поштою на спойлер MAIL користувача та може читатися за допомогою пошти.
shad0VV

1
Щоб отримати той самий ефект, що і оригінальну команду, вам потрібно було б додати -maxdepth 1.
Niels Keurentjes

0

Якщо я викликаю команду find безпосередньо з crontab кореня, а не як частина скрипту, вона працює.

У відповідному сценарії використовується csh. Я вірю, що середовище cron root на Ubuntu буде використовувати / bin / bash (або / bin / dash?). Можливо, це якимось чином суперечить тому, як виконувалася команда find.

Так чи інакше, головне питання, яке воно вирішило, хоча і дещо неелегантно.

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