LINUX.ORG.RU
решено ФорумAdmin

Не работает скрипт по CRON'у

 , ,


0

2

Уже голову сломал, но не могу понять, почему не работает скрипт удавления старых бэкапов по крону. Причём аналогичный скрипт создания бэкапов работает по крону нормально, и скрипт удаления при запуске из командной строки также нормально работает.

Вот скрипт /home/backup/rm_old_backups.sh:

#!/bin/bash
export PATH=/bin:/usr/bin
/usr/bin/find /home/backup/user-*.gz -type f -mtime +3 -delete

Вот содержимое /etc/cron.d/rm_old_backups:

2 5 * * * user /bin/bash /home/backup/rm_old_backups.sh

Вот запись в логе:

июл 17 05:02:01 machine-vcs CRON[31081]: pam_unix(cron:session): session opened for user user by (uid=0)
июл 17 05:02:01 machine-vcs CRON[31082]: (user) CMD (/bin/bash /home/backup/rm_old_backups.sh)
июл 17 05:02:02 machine-vcs CRON[31081]: pam_unix(cron:session): session closed for user user

Можно как-нибудь это дело отладить, либо лог записать куда?..

Система Ubuntu 16.04.2

Update: см. Не работает скрипт по CRON'у (комментарий)

★★★★☆

Последнее исправление: Sahas (всего исправлений: 3)

Ответ на: комментарий от Sahas

stderr финда, например. Ну сделай хотя бы так

#!/bin/bash
export PATH=/bin:/usr/bin
/usr/bin/find /home/backup/user-*.gz -type f -mtime +3 -delete >> /var/log/rm_old_backups.log 2>&1
legolegs ★★★★★
()
Ответ на: комментарий от FluffyPillow

а почему результат работы предложенной команды может отличаться от того, что есть сейчас?

Sahas ★★★★☆
() автор топика

Или же так:

#!/bin/bash
find /home/backup/ -type f -name "user-*.gz" -mtime +3 -exec rm {} \;

FluffyPillow
()
Ответ на: комментарий от Sahas

Ключ -name используется для передачи имён/масок нужных файлов. А вы решили передать маску вместе с директорией для поиска.

FluffyPillow
()
Ответ на: комментарий от Sahas

Не должно, по идее, но мало ли что мы упускаем. Разница в том, кто раскрывает звёздочку - баш или финд.

legolegs ★★★★★
()
Ответ на: комментарий от Sahas

Как уже написал комментатор выше - в зависимости от того, кто обрабатывает *

FluffyPillow
()
Ответ на: комментарий от Sahas

Попробуйте в кроне удалить какой-нибудь экспериментальный файл (из этой же папки) максимально похожим скриптом, но без маски. В общем, локализуйте проблему.

PS. Когда один и тот же скрипт работает сам по себе, но не работает из крона - чаще это недоразумения с путями

vaddd ★☆
()
Ответ на: комментарий от vaddd

Вероятно, дело действительно в маске. Посмотрю, как сработает скрипт с "-name" и завтра отпишусь о результате...

Sahas ★★★★☆
() автор топика

У вас проблема немного в другом, в самой логике, вы удаляете все файлы, не думая о том что это может оказаться и последний. Это распространенная ошибка.
Поясню, например у вас по какой-то причине сломалось создание бэкапов, но вот независимый скрипт удаления работает. Никто не обращал внимание на то что N дней (а у вас их вообще мало) бэкапы не создаются, ваш скрипт благополучно удаляет последний бэкап, после этого предположим накрывается сервак... бэкапов нет от слова совсем, бежим за вазелином.
PS

не, не шлёт (не настроено). А что там может быть?

Нууу исходя из формулировки вашей задачи много чего интересного в части ошибок да и просто выхлопа (зависит от системы и что запускается по крону) игнорировать выхлоп крона не очень хорошо.

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

Да, насчёт «дыры» в логике я в курсе, планирую в ближайшее время ей заняться, как только разберусь с кроном :)

Sahas ★★★★☆
() автор топика

Действительно, после указания маски в параметре "-name" скрипт заработал (см. Не работает скрипт по CRON'у (комментарий))

Спасибо FluffyPillow и другим товарищам за дельные советы :)

Мой (работающий) вариант скрипта:

#!/bin/bash
export PATH=/bin:/usr/bin
/usr/bin/find /home/backup/ -name "user-*.gz" -type f -mtime +3 -delete >> /tmp/rm_old_backups.log 2>&1
Sahas ★★★★☆
() автор топика
Последнее исправление: Sahas (всего исправлений: 1)
Ответ на: комментарий от Sahas

Мой (работающий) вариант скрипта:

Ну и накой вам тогда export PATH=... ? Если что-то заработало, то это вовсе не означает, что вы стали понимать что происходит :)

vodz ★★★★★
()
Ответ на: комментарий от vodz

Если что-то заработало, то это вовсе не означает, что вы стали понимать что происходит :)

какая глобально-философская фраза по отношению к любому человеку за компьютером )

vaddd ★☆
()
Ответ на: комментарий от vodz

Для «будущих поколений» :)

Неоднократно сталкивался в интернетах с упоминанием о том, что cron не устанавливает переменную PATH, поэтому скрипт по крону может не работать.

Однако другой скрипт (юзающий в т.ч. cp и др. команды) работает без установки переменной PATH. Это наталкивает на мысль, что что-то тут не так... Если подскажешь, кто прав — буду безмерно благодарен :)

Не работает скрипт по CRON'у (комментарий)

Sahas ★★★★☆
() автор топика
Последнее исправление: Sahas (всего исправлений: 2)
Ответ на: комментарий от vodz

Вот, стоило написать ответ и 10 сек погуглить по теме, как вопрос отпал сам собой :)

Дефолтный PATH устанавливается в /etc/crontab.

Так что в моём случае действительно установка PATH излишня.

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от Sahas

crond сам PATH не устанавливает, но PATH устанавливает init. Обычно там не будет /usr/local/(s)bin и тем более $USER/bin...

Так что в моём случае действительно установка PATH излишня.

Увы, вы опять ничего не поняли. В вашем случае $PATH вообще не используется.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

Обычно там не будет /usr/local/(s)bin

у меня есть :)

cat /etc/crontab | head -n 8:

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Увы, вы опять ничего не поняли. В вашем случае $PATH вообще не используется.

Это-то я сразу понял, я всё-таки не совсем «тупой» :)

Sahas ★★★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.