pg_dump через ssh останавливается через несколько секунд при использовании в скрипте

Делаю бэкап трех серверов PostgreSQL с запущенным скриптом pgdump через ssh. Командная строка в скрипте:

sudo -u barman ssh postgres@$SERVER 'pg_dump -Fc -b $database 2> ~/dump_error.txt' | gzip > $DUMP_ROOT/$SERVER-$BACKUPDATE.gz

Но размер дампа всегда около 1К, для всех серверов. Когда я выполняю эту строку в оболочке, просто заменяя переменные их значениями, это отлично работает. Он выполнил его как root (sudo -u barman ssh postgres@server ...) и как barman, так же, как пользователь barman (ssh postgres@server ...), дамп правильный.

Когда открываю дамп, вижу начало дампа, но вдруг он останавливается.

Файл dump_error.txt на серверах пуст.

В логах (журнале postgres и syslog), в бэкапе и серверах PostgreSQL ничего нет.

Пользователь barman может подключаться к серверу как пользователь postgres без пароля.

Ограничения оболочки достаточно высоки, чтобы не блокировать скрипт (открытые файлы 1024, размер файла не ограничен, максимальный пользовательский процесс 13098).

Я пытаюсь изменить cron час скрипта, думая, что процесс может потреблять все ресурсы, но это всегда одно и то же, и ps -e ничего особенного не показывает.

Версия postgreSQL 9.1.

Почему эта строка никогда не создает полный дамп при выполнении в сценарии, а только при выполнении в оболочке?

Спасибо за помощь, Денис


person Atatorus    schedule 20.06.2014    source источник


Ответы (1)


Ваша проблема связана с плохим цитированием. Простые кавычки заставят строку не расширяться, а двойные кавычки расширят то, что внутри. Например :

>MYVARIABLE=test
>echo '$MYVARIABLE'
$MYVARIABLE
>echo "$MYVARIABLE"
test

В вашем случае ssh postgres@$SERVER 'pg_dump -Fc -b $database 2> ~/dump_error.txt' выполнит команду на удаленном компьютере без расширения переменных. Это означает, что ssh передаст выражение pg_dump -Fc -b $database, а bash интерпретирует переменную $database на удаленном компьютере. Если этой переменной там нет, она будет считаться пустой строкой.

Вы можете увидеть разницу, когда делаете ssh user@server 'echo $PWD' и ssh user@server "echo $PWD".

person Aserre    schedule 20.06.2014