Скрипт Bash не работает в cron, объединяет строки иначе, чем при интерактивном вызове

Я работаю с дистрибутивом Debian. Я написал сценарий резервного копирования bash, который реализует ротацию моментальных снимков, он работает как шарм при интерактивном вызове из оболочки, но завершается неудачно при вызове из задания cron (пользователя root). В нескольких местах в скрипте я генерирую строки целевых путей следующим образом:

btrfs subvolume snapshot "$1/current" "$BASENAME-1" 

или же

btrfs subvolume delete "$BASENAME-$NUM_BAK"

В первом случае я создаю первый ежедневный снимок, а во втором случае я удаляю последний снимок, номер которого хранится в переменной NUM_BAK. Файл скрипта, как обычно, начинается с:

#!/bin/bash

Но я заметил, что при интерактивном "$BASENAME-1", когда $BASENAME "/mnt/backup/daily", последняя строка становится /mnt/backup/daily-1 при выполнении в cron сгенерированная строка становится /mnt/backup/daily- без окончательного номера.

Строка crontab:

52 1 0 * * * /root/backup-script/backupscipt.sh oneparam 2>&1 1>/mnt/logstuff/lastrun.log

Я пробовал разные решения.

1) Изменить запись в crontab:

52 1 0 * * * /bin/bash /root/backup-script/backup.sh oneparam 2>&1 1>/mnt/logstuff/lastrun.log

2) Добавление в crontab, прежде чем запись cron, следующих (как предлагается здесь):

BASH_ENV="/root/.bashrc"
SHELL=/bin/bash

Я не эксперт по оболочкам, и сначала я изменил весь этот сценарий bash на более "детерминированный" сценарий python. Мне нравится понимать, в чем проблема.

РЕДАКТИРОВАТЬ (спасибо за предложения): я создал сокращенную версию моего резервного скрипта, который фокусируется на подстановке строк. Но проблема исчезла... Я должен отследить проблему до таинственных взаимодействий. Я обновлю этот вопрос, когда у меня будет больше доказательств.

#!/bin/bash

#Configurations:
BACKUP_PATH='/mnt/backup'
NUM_DAYS=5; #number of total days

backup (){
    BASENAME="$1/$2"
    NUM_BAK=$3

    #Clean older backup-snapshot
    echo "basename for backup is $BASENAME"
    echo "expect to delete: daily-5"
    echo "to delete: $BASENAME-$NUM_BAK"
    #real operation omitted

    for i in $(seq $(($NUM_BAK-1)) -1 1); do
    #Shift backups 2->3 1->2 and so on
      #with + works as expected
      echo "Shifting $BASENAME $i to $i+1"
    done

    #I expect .../daily-1 from the following:
    echo "expecting snapshot name daily-1"        
    echo "creating the snapshot $BASENAME-1"      
}

echo "Synching remote folder to current"

#rsync part omitted...
#...
#end rsync part

echo "Daily backup rotation started"
backup $BACKUP_PATH "daily" $NUM_DAYS

0 ответов

Другие вопросы по тегам