bash 脚本...根据命令的返回代码发送电子邮件的问题

bash 脚本...根据命令的返回代码发送电子邮件的问题

我有这个脚本用于从远程主机获取 postgres 转储。

#!/usr/bin/bash

NOW=$(date +%F_%H%M%S)
DB_NAME='lafis'
DB_USER='postgres'
SOURCE='rd1397.rz-dvz.cn-mv.net'
DUMPDIR='/opt/db/export/postgres/dumps'
DUMPFILE="${DB_NAME}"_LaFIS_dump_prod_rd1397.dmp
EMAIL_TO='[email protected],[email protected]'
MIN_SPACE='46'

# check whether the dump_dir has minimum 51GiB free space
# stop execution, if not
if [ "$(df -h ${DUMPDIR} | awk 'NR==2 {print $4}' | sed 's/G//g')" -le "${MIN_SPACE}" ] ; then
   # hecho ; echo "   less then ${MIN_SPACE} GiB available @${DUMPDIR}. Stopping the dump for DB ${DB_NAME} now." ; echo
   echo ; echo "   less then ${MIN_SPACE} GiB available @${DUMPDIR}. Stopping the dump for DB ${DB_NAME} now." | \
   mailx -s [postgres@"${HOSTNAME}"]: ERROR: LaFIS_Dump_Erstellung_Ref "${EMAIL_TO}"
   exit
else
   # countdown 10 secs before starting the dump
   echo
   for ((i=10; i>=0; i--)); do
      # echo "   ${DUMPDIR} has $(df -h ${DUMPDIR} | tail -1 | awk {'print $4'}) of free space. taking a dump in $i seconds"
      echo "   ${DUMPDIR} has $(df -h ${DUMPDIR} | awk 'NR==2 {print $4}') GiB of free space. taking a dump in $i seconds"
      sleep 1s
   done
   sleep 10s

   # get the dumb of ${DBNAME} from ${SOURCE}
   nice pg_dump -h "${SOURCE}" -d "${DB_NAME}" -U "${DB_USER}" -v -Fd -j 2 \
   -f "${DUMPDIR}"/"${DUMPFILE}"_"${NOW}" >>  "${DUMPDIR}"/"${DUMPFILE}"_"${NOW}".out 2>&1
fi

# save return code into variable
RC=$?
export RC

# send mail for error or sucess
if [ $RC -ne 0 ]; then
   echo "ERROR: LaFIS_Dump_Erstellung_Ref ${DB_NAME} ist nicht fehlerfrei gelaufen" | \
   mailx -s [postgres@"$HOSTNAME"]: ERROR: LaFIS_Dump_Erstellung_Ref "${EMAIL_TO}"
   exit 1
else
   echo "SUCCESS: LaFIS_Dump_Erstellung_Ref ${DB_NAME} ist fertig" | \
   mailx -s [postgres@"$HOSTNAME"]: SUCCESS: LaFIS_Dump_Erstellung_Ref "${EMAIL_TO}"
fi
exit 0

这将一直有效,直到最后发送成功或失败的电子邮件(在 if..else 部分之后)。

编辑:pg _dump 已执行(显然成功),但没有发送邮件。

知道那里出了什么问题吗?一开始的mailx命令有效,所以我认为问题在于没有继续到最后的if..else。

答案1

我看到一些潜在的问题:

  1. RC将始终为零,因为它报告前面的命令if成功,而不是子条款中最后一个命令的结果if(我猜这就是你想要的)
  2. 您的意思是导出吗RC?有这个要求吗?
  3. $HOSTNAME不需要在主题内引用,因为主机名不允许有空格。
  4. 下面的主题文本mailx -s应完全引用,例如mailx -s "[postgres@$HOSTNAME]: SUCCESS: LaFIS_Dump_Erstellung_Ref" "${EMAIL_TO}"
  5. (Mymailx是 GNU 的别名mail.mailutils,不适用于您正在使用的语法)

相关内容