código de salida psql 2 en bashscript

1

postgres 9.6 Debian GNU / Linux 9

se usa siguiendo un script bash simple que se llama desde el crontab de un usuario, myid es un parámetro pasado:

#!/bin/bash
...
PGPASSFILE="/home/user/.pgpass"
PGCONNECT=" psql -U myuser -w -h 000.000.000.000 -d mydatabase -p 5432"
PGCOMMAND1="SELECT something, somemmore FROM schema.table WHERE id= ${myid}"
PGRESULT=`$PGCONNECT -A -F ";" -t -c "$PGCOMMAND1"`
RETCODE1=$?
...
PGCOMMAND2="SELECT schema.functionname(${myid});"
PGRESULT=`$PGCONNECT -A -F ";" -t -c "$PGCOMMAND2"`
RETCODE2=$?

if [ $RETCODE1 -eq 0 ] &&  [ $RETCODE2 -eq 0 ]; then
          mailx -s sendme_asuccessemail
else
          echo -e "ret1: $RETCODE1\n" >> $MAIL_FILE
          echo -e "ret2: $RETCODE2\n" >> $MAIL_FILE
          mailx -s sendme_errormailwith retcode1=2
fi

y la mayoría de las veces todo está bien (el script se ejecuta 60 veces al día en diferentes momentos). una vez por semana o menos recibo un mensaje de error con el estado de salida de psql 2 en RETCODE1 como resultado de la selección.

de la página del manual:

 2 if the connection to the server went bad and the session was not
       interactive

puede suceder, este script se llama por usercrontab, que se ejecuta dos veces o más al mismo tiempo con myid diferente. Siempre se llama al segundo comando, que hace el trabajo real.

¿Cómo puedo reducir el error? ¿Qué significa realmente el error? ¿Puedo ignorarlo?

FatFreddy
fuente
Esto sucedería cuando el servidor PostgreSQL se vea obligado a cerrar (asesino de OOM, reiniciar ...) o un backend se bloquee. Desea ver qué hay en los registros del servidor PostgreSQL cuando se produce el problema.
Daniel Vérité
@Daniel Vérité bueno, ese es el problema, no veo ningún mensaje o error en el servidor. La memoria es satisfactoria, 128 GB, 7 GB utilizados, el intercambio no se utiliza en absoluto.
FatFreddy

Respuestas:

1

El código de salida psql 2 puede ignorarse si no es demasiado frecuente, la razón podría ser la red o el estado de la base de datos. Para cavar más, puede agregar pasos de depuración al script que muestra la conectividad de red y el estado de la base de datos (el servidor está ocupado y cargado de consultas) antes de realizar un trabajo real.

asktyagi
fuente
No es realmente la respuesta que esperaba obtener, después de algunas pruebas con stderr y stout parece que, bueno, algo se perdió. Lo resolví de esa manera, si hay un código de retorno = 2, duerme 2 segundos y vuelve a hacer la selección, si todavía hay un código de retorno 2, bueno, ignóralo. gracias
FatFreddy