我正在使用 Debian 发行版。我编写了一个实现快照轮换的备份 bash 脚本,它在从 shell 以交互方式调用它时就像一个魅力,但在从 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条目,这个(如建议here):
BASH_ENV="/root/.bashrc"
SHELL=/bin/bash
我不是 shell 专家,我首先将所有这些 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