Bash 焦油不';t无法正常使用crontab
首先,我要说的是,它不能与crontab一起正常工作,因为当我手动运行脚本时,它可以正常工作 问题是当我使用cronjob运行备份脚本时。。。它将对mysql转储进行tar升级,tar存档只有Bash 焦油不';t无法正常使用crontab,bash,backup,mysqldump,freebsd,tar,Bash,Backup,Mysqldump,Freebsd,Tar,首先,我要说的是,它不能与crontab一起正常工作,因为当我手动运行脚本时,它可以正常工作 问题是当我使用cronjob运行备份脚本时。。。它将对mysql转储进行tar升级,tar存档只有16字节大小(而且它是空的,所以看起来没有文件要打包到存档中),奇怪的是,当我手动运行脚本时,它运行了将近5分钟,tar包大小是~1.8GB 下面是我的bash代码: #!/usr/local/bin/bash # Configuration BACKUPD="/backup/mysql" MySQLuse
16
字节大小(而且它是空的,所以看起来没有文件要打包到存档中),奇怪的是,当我手动运行脚本时,它运行了将近5分钟,tar包大小是~1.8GB
下面是我的bash代码:
#!/usr/local/bin/bash
# Configuration
BACKUPD="/backup/mysql"
MySQLuser='root'
MySQLpass='xxxx'
# End configuration
ROK=`date +%Y`
MIESIAC=`date +%m`
DZIEN=`date +%d`
GIM=`date +%H-%M`
if [ -d $BACKUPD/$ROK/$MIESIAC/$DZIEN ]
then
echo
else
mkdir -p $BACKUPD/$ROK/$MIESIAC/$DZIEN
fi
for db in $(echo "SHOW DATABASES;" | mysql --user=$MySQLuser --password=$MySQLpass | grep -v -e "Database" -e "information_schema")
do
mysqldump --skip-lock-tables --ignore-table=log.log --user="$MySQLuser" --password="$MySQLpass" $db >$BACKUPD/$ROK/$MIESIAC/$DZIEN/$db.sql
done
cd $BACKUPD/$ROK/$MIESIAC/$DZIEN && tar jcPf $BACKUPD/$ROK/$MIESIAC/$DZIEN/mysql-$GIM.tar.bz2 *.sql && rm -rf *.sql
问题在哪里?以前有没有人遇到过这样的问题
问候。我猜最后一行是你的问题。shell glob(
*.sql
)位于:
在当前目录中展开,而不是在cd
之后展开。请尝试以下方法,这样更安全
old_dir=`pwd`
cd "$BACKUPD/$ROK/$MIESIAC/$DZIEN"
tar jcPf mysql-$GIM.tar.bz2 *.sql
rm -fr *.sql
cd "$old_dir"
可能仍然没有任何.sql
文件可用于tar ball。我没有安装mysql
,但我怀疑for
循环也有问题。请尝试以下方法:
mysqlshow | \
xargs mysqldump --databases | \
bzip2 > $BACKUPD/$ROK/$MIESIAC/$DZIEN/mysql-$GIM.bz2
您可能需要为
mysqlshow
和mysqldump
命令插入其他参数。当然,这不会创建tarball,但会给您一个压缩备份。您可以尝试在脚本中使用mysqldump
和mysql
的完整路径名吗
因此:
如果哪个mysql
等于/usr/local/mysql/bin/mysql
及
如果哪个mysqldump
等于/usr/local/mysql/bin/mysqldump
将脚本修改为:
for db in $(echo "SHOW DATABASES;" | /usr/local/mysql/bin/mysql --user=$MySQLuser --password=$MySQLpass | grep -v -e "Database" -e "information_schema")
do
/usr/local/mysql/bin/mysqldump --skip-lock-tables --ignore-table=log.log --user="$MySQLuser" --password="$MySQLpass" $db >$BACKUPD/$ROK/$MIESIAC/$DZIEN/$db.sql
done
一般来说,最好包括非内部命令的路径。在我的系统上,tar是/bin/tar@gview我明白你的意思,但我认为问题不在于tar本身,而在于mysqldump,它不转储任何东西,然后tar没有要打包的文件,所以它是空的。嘿,你的脚本对我来说工作得很好。你能粘贴你的
crontab
条目和which bash
@Suku crontab:*/5****/usr/local/bin/bash/home/utils/backup\u ftp.sh>/dev/null 2>&1
,which bash:\which bash/usr/local/bin/bash
。crontab看起来也很完美。您可以尝试在脚本中使用mysqldump
和mysql
的完整路径名。不幸的是,它不是:/
,输出包仍然是空的+1现在!
for db in $(echo "SHOW DATABASES;" | /usr/local/mysql/bin/mysql --user=$MySQLuser --password=$MySQLpass | grep -v -e "Database" -e "information_schema")
do
/usr/local/mysql/bin/mysqldump --skip-lock-tables --ignore-table=log.log --user="$MySQLuser" --password="$MySQLpass" $db >$BACKUPD/$ROK/$MIESIAC/$DZIEN/$db.sql
done