Скрипт 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