имеем:
FreeBSD 8.0 и sh скрипт для бекапа mysql и файловзадача: раз в сутки по крону бекапить базы и файлы и акуратно складывать в папки
проблема: скрипт прекрасно работает, если запускать самому, работает из под рута и из под простого юзера backup, но при добавление в крон, скрипт упорно отказывается входить в оператор for, как раз таки где и происходит бекап баз. Изголялся с кроном уже, как мог, запускал от разных юзеров, дописывал PATH и SHELL
все равно одно и то же.
Папка $DIR/$DAY создается и в ней появляется files_backup.tgz, но вот дампы не делаются, по причине того, что цикл for не отрабатывает...
Сначала думал, что касячит вызов функции backup_mysql, пробовал без использования функции, но при этом функция backup_files всегда отрабатываланиже привожу листинг скрипта, ткните носом, где ошибся, у меня глаз уже замылился, кучу времени убил на эту ерунду, самому стыдно...
за основу брался этот скрипт http://www.cyberciti.biz/tips/how-to-backup-mysql-databases-...#!/bin/sh
WORKDIR='/root/backup'
DIR='/home/backup/files'
DAY=`date +%F`
TEST=`ls -l $DIR | grep $DAY | wc -l`if [ $TEST = 0 ];.
then
mkdir $DIR/$DAY
fi### MySQL Setup ###
MUSER="dump"
MPASS="password"
MHOST="localhost"### Where is BIN files ###
MYSQL=`which mysql`
MYSQLDUMP=`which mysqldump`
GZIP=`which gzip`
TAR=`which tar`
FIND=`which find`
RMDIR=`which rmdir`DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases' | grep -v 'information_schema' | grep -v 'mysql')"
backup_mysql ()
{
for db in $DBS;
do
dbDAY=`date +%H-%M`
FILE=$DIR/$DAY/$db-$dbDAY.sql.gz
$MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS --database $db | $GZIP -1 > $FILE
done
}
backup_files ()
{
LIST=`cat $WORKDIR/backup_list`
FOLDER=`$TAR -czf $DIR/$DAY/files_backup.tgz $LIST`
}backup_mysql
backup_files$FIND $DIR/* -type d -mtime +7 -exec $RMDIR -R {} \;
cron
0 6 * * * /root/backup/backup.sh > /dev/null 2>&1
а переменная $DBS не пустая перед входом в цикл (из под крона) ?
>а переменная $DBS не пустая перед входом в цикл (из под крона)
>?Конечно пустая. Не прописан путь к grep.
>>а переменная $DBS не пустая перед входом в цикл (из под крона)
>>?
>
>Конечно пустая. Не прописан путь к grep.вы попали в точку, переменная DBS пустая
я добавил в свой скрипт
GREP=`which grep`DBS=`$MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases' | $GREP -v 'information_schema' | $GREP -v 'mysql'`
результат то же...
потом опытным путем я выяснил, что переменная DBS пустая даже если сделать так
DBS=`$MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases'`как можно по другому получить список баз данных?
спасибо
>я добавил в свой скрипт
>GREP=`which grep`ну и про $MYSQL то же самое. А как узнать путь к which? Сейчас не могу проверить, но по идее прописывание в начало скрипта
PATH=/sbin:/usr/sbin:/bin:/usr/bin
должно решить вашу проблему.
>>я добавил в свой скрипт
>>GREP=`which grep`
>
>ну и про $MYSQL то же самое. А как узнать путь к
>which? Сейчас не могу проверить, но по идее прописывание в начало
>скрипта
>PATH=/sbin:/usr/sbin:/bin:/usr/bin
>должно решить вашу проблему.вобще странная ерунда творится...
по идее если говорить о пути к grep, то ошибка должна возникнуть еще в самом начале скрипта, когда определяется наличие папки, но все проходит нормально и папка всегда создается
TEST=`ls -l $DIR | grep $DAY | wc -l`если попробывать ваш вариант прописать PATH=/sbin:/usr/sbin:/bin:/usr/bin
то скрипт вобще отказывается дампить БД даже при запуске из консоли, при этом архивирование файлов проходит удачно...
мне кажется весь затык здесь
DBS=`$MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases' | $GREP -v 'information_schema' | $GREP -v 'mysql'`
>если попробывать ваш вариант прописать PATH=/sbin:/usr/sbin:/bin:/usr/bin
>то скрипт вобще отказывается дампить БД даже при запуске из консоли, при
>этом архивирование файлов проходит удачно...Забыл что в FreeBSD несистемные бинарники лежат в /usr/local. Тогда можно попробовать так:
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
>>если попробывать ваш вариант прописать PATH=/sbin:/usr/sbin:/bin:/usr/bin
>>то скрипт вобще отказывается дампить БД даже при запуске из консоли, при
>>этом архивирование файлов проходит удачно...
>
>Забыл что в FreeBSD несистемные бинарники лежат в /usr/local. Тогда можно попробовать
>так:
>PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/binпроблема решилась простым прописыванием абсолютных путей к файлам
MYSQL='/usr/local/bin/mysql'
MYSQLDUMP='/usr/local/bin/mysqldump'
GZIP='/usr/bin/gzip'
TAR='/usr/bin/tar'
FIND='/usr/bin/find'
RMDIR='/bin/rmdir'
GREP='/usr/bin/grep'спасибо за помощь, будет для меня уроком...
Мужики-то не знают http://www.google.ru/search?q=cron+sh+path+site%3Aopenn...