我正在为我的电子邮件和云服务编写备份脚本。
为简单起见,我仅在此处发布了邮件备份部分。
基本上,我有一台主机,其中运行着一些虚拟盒子。
这些虚拟盒子访问主机机器,/mnt/alias/storage/
其中有vmail文件夹(在我的情况下称为shishaMail)
(以下可能不是必要的信息)
我想说的是,其中的所有内容/mnt/alias/
都是带有漂亮名字的ln -s
from /mnt/rack/*
。
在该机架文件夹中是驱动器的支架。
(没有必要的信息END)
这是我的剧本
#!/bin/bash
# backup script
BASEURL="/mnt/alias/backup"
MAILURL="/mnt/alias/storage/shishaMail"
DAY=`eval date +"%d"`
MONTH=`eval date +"%m"`
YEAR=`eval date +"%Y"`
HOUR=`eval date +"%H"`
MINUTE=`eval date +"%M"`
PIMPURL=$BASEURL/$YEAR/$MONTH/$DAY/
COMMAND1="cd $PIMPURL"
$COMMAND1 2>/dev/null
if [ $? -eq 0 ]
then
echo "Command 1 was successful"
else
echo "There ain't folders!!"
echo "I'll mkdir some!"
COMMAND2="mkdir -p $PIMPURL"
$COMMAND2 2>/dev/null
fi
if [ $? -eq 0 ]
then
echo 'Command 1 or/and 2 was successful'
echo "STARTING MAIL BACKUP"
COMMAND3="tar -cvzf '"$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz' "$MAILURL
echo $COMMAND3
$COMMAND3 2>/dev/null
if [ $? -eq 0 ]
then
echo 'MAIL BACKUP SUCCESSFULL'
else
echo "FAILURE!!"
fi
else
echo 'Nope! Must be some kind of strage Err0r!!'
fi
因此,如果执行此脚本,则会出现以下错误:
命令1成功执行
命令1或/和2成功执行
启动邮件备份
tar -czvf'/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz'/ mnt / alias / storage / shishaMail
tar:从成员名称
tar(子级)中删除前导“ /”:'/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz':无法打开:无此类文件或目录
tar(子级):错误无法恢复:现在退出
失败!!
如您所见echo
,COMMAND3是一个:
tar -czvf'/mnt/alias/backup/2014/06/13/shisha_10_21_.data.tar.gz'/ mnt / alias / storage / shishaMail
而且,如果我手动执行此命令,则与执行脚本的用户相同(在两种情况下均为root用户),脚本将起作用。
我不明白为什么脚本会抱怨目录不存在,因为目录必须存在,但*.tar.gz
文件除外,因为该文件必须由创建tar
。
尝试从COMMAND3创建行中删除单引号:
COMMAND3="tar -cvzf "$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz "$MAILURL
当您手动执行该行时,shell会在tar看不到参数之前删除引号。
您没有在文件名中插入空格,因此引号不是必需的。实际上,您可以进一步简化该行:
COMMAND3="tar -cvzf ${PIMPURL}shisha_${HOUR}_${MINUTE}_.data.tar.gz ${MAILURL}"
花括号用于分隔变量名,否则将尝试扩展“ PIMPURLshisha”,可能不是您想要的。使用它们永远不会有伤害,因为它也使变量脱颖而出,更容易挑选出来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句