Bash 焦油不';t无法正常使用crontab

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

首先,我要说的是,它不能与crontab一起正常工作,因为当我手动运行脚本时,它可以正常工作

问题是当我使用cronjob运行备份脚本时。。。它将对mysql转储进行tar升级,tar存档只有
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