我写了一个shell脚本来自动检查Oracle Data Guard的状态并通过邮件发送。
如果我手动执行脚本,它就会像它应该的那样工作。
如果我通过 cronjob 执行脚本,它只会发送空电子邮件。 此行为仅在我们将服务器从 oracle linux 7 更新到 oracle linux 8 后才开始。
这是脚本:
#!/bin/bash
#. ~/envBIPROD.sh
source /home/oracle/.bash_profile
source /home/oracle/envBIPROD.sh
dgmgrl -silent user/pass >biprod.txt << EOF
show configuration;
show database p1biprod;
show database s1biprod;
EOF
cat biprod.txt | mail -r $(whoami).$(hostname -s)@hostname.tld -s "DATA GUARD Status biprod" [email protected]
这是设置 oracle home 的“envBIPROD.sh”脚本:
export ORACLE_SID=BIPROD1
export ORAENV_ASK=NO
. oraenv
export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/OPatch:$PATH
当脚本由 cron 运行时,文件“biprod.txt”只是空的。
它可能在您无权创建文件的目录中运行,因此
>biprod.txt
失败。如果 biprod.txt
只在脚本运行时存在,那么请执行以下操作:
biprod=$(mktemp) || exit 1
trap 'rm -f "$biprod"; exit' EXIT
dgmgrl -silent user/pass > "$biprod"
...
cat "$biprod" | ...
尽管您几乎可以肯定可以使用
< "$biprod" mail ...
而不是 cat "$biprod" | mail ...
)。添加一些 printf
来报告失败对您来说也没什么坏处。