Quero executar esta função no login como usuário postgres
postgres@servcer:~/.bash.d/functions> cat check_pg-instances.func
#!/usr/bin/bash
# ##############################################################################
#
# function to detect all running postgres instances and check them with pg_isready
#
# ##############################################################################
is_primary() {
pg_port=$1
primary=$( psql -p "${pg_port}" -tc "SELECT state FROM pg_stat_replication ;" )
secondary=$(psql -p "${pg_port}" -tc "SELECT client_hostname FROM pg_stat_replication ;" \
| cut -d '.' -f1 | sed "s/^ //" )
}
is_replica() {
pg_port=$1
replica=$(psql -p "${pg_port}" -tc "SHOW primary_conninfo ;" | head -1 | sed "s/^ //" )
main=$( psql -p "${pg_port}" -tc "SHOW primary_conninfo ;" | head -1 | sed "s/^ //" \
| awk {'print $3'} | sed "s/'//g" | cut -d '=' -f 2 | cut -d '.' -f 1 )
}
replication_status() {
if [[ -n ${primary} ]] ; then
echo replicated by \> "${secondary}"
elif [[ -n ${replica} ]] ; then
echo replicating from \< "${main}"
else
echo STANDALONE
fi
}
function check_pg-instances() {
# make sure we are at the right location #################################
cd "$PGBIN" || exit
# variables ##############################################################
local instance_names=($(grep PGPORT= .pg*.env | sort -t '=' -k2,2 | cut -d '.' -f2 | sed "s/^pg-//" ))
local ports=($(grep PGPORT= .pg*.env | cut -d '=' -f2 | sort -t '=' -k2,2 | tr '\n' ' ' ))
local counter=$( echo "${instance_names[@]}" | wc -w )
local count=0
echo ; echo ================================================================================
while [[ "${counter}" -gt 0 ]] ; do
if $(psql -p ${ports[$count]} -l >/dev/null 2>&1) ; then
is_primary ${ports[$count]}
is_replica ${ports[$count]}
fi
echo -e "postgres $( pg_isready -p ${ports[$count]} | sed "s#/tmp:${ports[$count]} - ##" ) | port: ${ports[$count]} | ${instance_names[$count]} \
| $(replication_status)"
counter=$(( "${counter}" - 1 ))
count=$(( "${count}" + 1 ))
done
echo ================================================================================ ; echo
}
atualmente eu lido com isso ~/.bashrc
como
# User specific functions ######################################################
test -d ~/.bash.d/functions && . ~/.bash.d/functions/*.func || true
# check postgres instances #####################################################
check_pg-instances
Agora, minha pergunta é se isso é inteligente ou talvez seja melhor colocar tudo isso (carregar os functions/*.func
arquivos e executar check_pg_instances
) em um script e executá-lo na inicialização.
Posso imaginar que, da maneira como estou fazendo agora, eu possa ter essa(s) função(ões) na memória durante toda a sessão e não apenas quando ela for realmente necessária.
Sim, você terá todos os 2 kB dessas funções na memória.
Preocupar-se se o bash usa 2 kB de RAM, ou seja, menos que uma página de memória, em um servidor de banco de dados, é muito bobo.
Declare essas funções sempre que for conveniente.
Como de costume para quaisquer considerações de desempenho, a hipótese nula é "não importa". Você pode assumir isso com segurança, a menos que use uma quantidade considerável de sua RAM geral, ou se acontecer milhares de vezes por segundo. Essas funções de shell são ordens de magnitude abaixo de qualquer critério, então elas não importam.