LinuxForum.Fans
Тема

Перенаправление вывода при создании дампа БД PostgreSQL 8.4 по cron

Автор: u1684 9 сообщений 9857 просмотров
#2981

Делаю дамп БД PostgreSQL 8.4 по cron вот такой командой:

text
$pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name 

КАК перенаправить её вывод в мой файл $pgdump_dir/log?

Читал:
http://rus-linux.net/MyLDP/HOWTO-ru/Bash-Progr-Intro-HOWTO/Bash-Prog-Intro-HOWTO-3.html
Делал:

text
$pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name &> $pgdump_dir/log 

Создает только пустой файл :(

#3001
cx написал:

Читал:
***
Создает только пустой файл :(

Хорошо, что читали. Похвально! (Прочтите этот пост до конца, прежде, чем что-то делать :) )
А так пробовали?

text
pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name 2> $pgdump_dir/log& 

Надо учесть, что, возможно, нужные вам сообщения идут не в stdout, а в stderr.
Не знаю, нужен ли Вам & в конце. Думаю, что только для испытаний из консоли, а не для использования в cron.
Кстати, рекомендую поместить команду в отдельный файл в виде:

text
#!/bin/bash
# Строчка выше важна - не удалять
$pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name 2> $pgdump_dir/log
# или же: $pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name > $pgdump_dir/log

А уже его вызывать по cron, иначе вывод в файл вообще может не сработать (возможно, это единственное, что Вам нужно сейчас сделать)

#3014
MageWarrior написал:
Хорошо, что читали. Похвально! (Прочтите этот пост до конца, прежде, чем что-то делать )
А так пробовали?
pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name 2> $pgdump_dir/log&

Надо учесть, что, возможно, нужные вам сообщения идут не в stdout, а в stderr.
Не знаю, нужен ли Вам & в конце. Думаю, что только для испытаний из консоли, а не для использования в cron.

Да, пробовал. Не помогло. Оператор "&>", который я уже использовал выше, помещает весь вывод программы в файл (в том числе и вывод ошибок).

MageWarrior написал:
Кстати, рекомендую поместить команду в отдельный файл в виде

Изначально уже написан файл скрипта который запускается по cron, в котором определенны все переменные и команды.

При запуске из консоли (по cron тож) скрипт выполняет всё, за исключением передачи выходного потока в файл log.
Пробовал через:

text
echo `pgutils_dir/pg_dump -f $dump_file_name -Fc -v $base_name` >> $pgdump_dir/log

- добавляет в log пустую строку и продолжает выводить сообщения в консоль (в стандартный поток вывода)
Пробовал уже и через cat. Всё одно. Может проблема в том, что вывод сосотоит из нескольких строк?

Разобрался.
Действительно нужно было 2>>.
И ниже в скрипте тож исправить на >> log в замен > log
MageWarrior, спасибо за ссылку :D



Есть альтернатива такого оператора: &>> ?
Этот (&>>) выдает ошибку.

#3031

Есть альтернатива такого оператора: &>> ?
Этот (&>>) выдает ошибку.

Какую ошибку? Например, у меня отрабатывает на отлично. Добавляет в файл stderr и stdout. Приведите ошибку и команду, которую выполняете (можно весь скриптик, если он не очень велик :) )

#3074

При возникновении ошибки в одной из команд скрипта прекращается его дальнейшее выполнение. Как это исправить?

#3083
cx написал:
При возникновении ошибки в одной из команд скрипта прекращается его дальнейшее выполнение. Как это исправить?

Такое может случаться при ошибках синтаксиса, возникающих в любой ситуации или только при определенном состоянии данных. В любом случае, Вы должны это как минимум предусмотреть и предупредить с помощью условий. На сколько я помню тонкости bash, try... except здесь нет. Приведите конкретно то, что не получается - от этого и будем отталкиваться.

#3095
text

$pgutils_dir/psql -d $base -c "SELECT task_after_restart('user1')" 2>> $pgdump_dir/error.log # при возникновении ошибки в SQL команде сценарий прекрвщает работу
$pgutils_dir/psql -d $base -c "SELECT task_after_restart('user2')" 2>> $pgdump_dir/error.log 
$pgutils_dir/psql -d $base -c "SELECT task_after_restart('user3')" 2>> $pgdump_dir/error.log
echo `date +"%Y.%m.%d-%H:%M:%S"`" - tasks execute" >> $pgdump/dump_stat.log
#3132
cx написал:
text

$pgutils_dir/psql -d $base -c "SELECT task_after_restart('user1')" 2>> $pgdump_dir/error.log # при возникновении ошибки в SQL команде сценарий прекрвщает работу
$pgutils_dir/psql -d $base -c "SELECT task_after_restart('user2')" 2>> $pgdump_dir/error.log 
$pgutils_dir/psql -d $base -c "SELECT task_after_restart('user3')" 2>> $pgdump_dir/error.log
echo `date +"%Y.%m.%d-%H:%M:%S"`" - tasks execute" >> $pgdump/dump_stat.log

Хм... странно, однако. Я опробовал различные вариации ошибок - ни на одной скрипт не остановился. Вставьте после каждой команды echo "Что-нибудь" , чтобы точно знать, что выполнение скрипта остановилось. Покажите пример "падения" скрипта, какая ошибка при этом сообщается bash? Возможно, это какие-то параметры самой shell, о которых я не в курсе. Надо почитать...

Наверное, нашел.
Если bash запускать с опцией -e или выполнять в скрипте set -e, то после первой же команды с ненулевым статусом возврата произойдет выход из скрипта. Если Вы не делали ни того, ни другого, то попробуйте принудительно установить противоположный режим с помощью set +e в начале скрипта.

#3895

:D Ага. Стоял такой параметр.

Войдите или зарегистрируйтесь, чтобы ответить.