我想以 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
}
目前我是这样处理~/.bashrc
的
# User specific functions ######################################################
test -d ~/.bash.d/functions && . ~/.bash.d/functions/*.func || true
# check postgres instances #####################################################
check_pg-instances
现在我的问题是,这样做是否聪明,或者将所有这些(加载functions/*.func
文件并执行check_pg_instances
)放入脚本并在启动时执行是否更好。
我可以想象,按照我现在的方式,我可能会在整个会话期间将该功能存储在内存中,而不仅仅是在实际需要时。
是的,您将在内存中拥有这所有 2 kB 的这些功能。
担心 bash 是否在数据库服务器上使用 2 kB 的 RAM(即少于一个内存页),是非常愚蠢的。
在方便的地方声明这些函数。
对于任何性能考虑,通常情况下,零假设是“这无关紧要”。您可以安全地假设这一点,除非它占用了相当多的总体 RAM,或者每秒发生数千次。这些 shell 函数的数量级低于任何一个标准,因此它们无关紧要。