URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8736
[ Назад ]

Исходное сообщение
"не отрабатывает оператор for, если пускать скрипт по крону"

Отправлено panoff , 16-Май-10 04:35 
имеем:
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


Содержание

Сообщения в этом обсуждении
"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено теоретик , 16-Май-10 07:13 
а переменная $DBS не пустая перед входом в цикл (из под крона) ?

"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено ктото , 16-Май-10 09:19 
>а переменная $DBS не пустая перед входом в цикл (из под крона)
>?

Конечно пустая. Не прописан путь к grep.


"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено panoff , 16-Май-10 16:28 
>>а переменная $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'`

как можно по другому получить список баз данных?

спасибо


"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено ктото , 16-Май-10 17:10 
>я добавил в свой скрипт
>GREP=`which grep`

ну и про $MYSQL то же самое. А как узнать путь к which? Сейчас не могу проверить, но по идее прописывание в начало скрипта
PATH=/sbin:/usr/sbin:/bin:/usr/bin
должно решить вашу проблему.


"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено panoff , 16-Май-10 23:28 
>>я добавил в свой скрипт
>>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'`


"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено ктото , 17-Май-10 00:30 
>если попробывать ваш вариант прописать PATH=/sbin:/usr/sbin:/bin:/usr/bin
>то скрипт вобще отказывается дампить БД даже при запуске из консоли, при
>этом архивирование файлов проходит удачно...

Забыл что в FreeBSD несистемные бинарники лежат в /usr/local. Тогда можно попробовать так:
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin


"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено panoff , 17-Май-10 01:26 
>>если попробывать ваш вариант прописать 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'

спасибо за помощь, будет для меня уроком...


"не отрабатывает оператор for, если пускать скрипт по крону"
Отправлено Andrey Mitrofanov , 17-Май-10 10:21 
Мужики-то не знают http://www.google.ru/search?q=cron+sh+path+site%3Aopenn...