glem1337
@glem1337

Через консоль работает, с помощью cron нет?

crontab -e:
Там 30 13 * * * /home/backup/delete.sh bitmirpack /home/backup >> /tmp/debug_cron 2>&1

скрипт delete.sh
#!/bin/bash
SAVE_LIMIT=2

kernel_name=$1
backup_dir=$2
# clean old backup
clean_old_backup_files(){
    LIMIT_DAYS=$(date -d "$SAVE_LIMIT day ago" +%d.%m.%Y)
    TAR_OLD=$(find $backup_dir -name "www_backup_${kernel_name}_${LIMIT_DAYS}.tar.gz" | wc -l)
    if [[ $TAR_OLD -gt 0 ]]; then
        rm -f "www_backup_${kernel_name}_${LIMIT_DAYS}.tar.gz"
    fi
        SQL_OLD=$(find $backup_dir -name "mysql_dump_${kernel_name}_${LIMIT_DAYS}.sql" | wc -l)
    if [[ $SQL_OLD -gt 0 ]]; then
        rm -f "mysql_dump_${kernel_name}_${LIMIT_DAYS}.sql"
    fi
    SQL_AFTER_CONNECT_OLD=$(find $backup_dir -name "mysql_dump_${kernel_name}_${LIMIT_DAYS}_after_connect.sql" | wc -l)
    if [[ $SQL_AFTER_CONNECT_OLD -gt 0 ]]; then
        rm -f "mysql_dump_${kernel_name}_${LIMIT_DAYS}_after_connect.sql"
    fi
}

clean_old_backup_files


Содержимое папки(права, владельцы файлов):
-rw-r--r-- 1 root root 44 Sep 9 11:18 mysql_dump_bitmirpack_07.09.2019_after_connect.sql
-rw-r--r-- 1 root root 435986705 Sep 9 11:18 mysql_dump_bitmirpack_07.09.2019.sql
-rwxr--r-- 1 root root 873 Sep 9 13:21 delete.sh
-rw-r--r-- 1 root root 2180485120 Sep 9 11:21 www_backup_bitmirpack_07.09.2019.tar.gz

Сегодня 09.09.2019, а значит в результате должны быть удаленны файлы 07.09.2019, но как и описано в теме задачи, выполняется удаление только если запустить через консоль. В /tmp/debug_cron пусто.
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
@SunTechnik
1. По дате модификации файла /tmp/debug_cron понять, задание из cron вообще стартует или нет.

2. Если задание стартует, после #!/bin/bash вписать строчку
set -x

В логе увидим какие команды с какими аргументами выполнялись.

Если приведена часть большого скрипта, то надо учесть, что окружение (env) в cron отличается от окружения в терминале. Может каких-то переменных не хватает.... Хотя скрипт вроде простой...

3. В скрипте используются относительные имена. Текущий каталог для задания в cron может отличаться.
В скрипте добавьте вначале строку: cd <нужный каталог>
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@iddqda
network engineer, netdevops
Скорей всего проблема с переменными окружения
где скрипт должен искать bitmirpack?
Недавняя статья на Хабре как раз про это
Ответ написан
@poige
Через консоль работает, с помощью cron нет?


Из консоли, небось, в нужном каталоге работает, а cron-то его не в оном запускает.
Ответ написан
Комментировать
fzfx
@fzfx
18,5 дм
30 13 * * * /bin/bash /home/backup/delete.sh bitmirpack /home/backup >> /tmp/debug_cron 2>&1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы