已经使用 stderr,如何检测 bash 脚本中是否存在错误

已经使用 stderr,如何检测 bash 脚本中是否存在错误

我从多个网站支持小型数据库,并向管理员发送包含结果的电子邮件。我已经指示 stderr 在电子邮件中发送完整的错误。有没有办法检测是否发生错误,以便我可以更改电子邮件主题以匹配?

我使用两个文件,第一个文件只是进行设置,并且在每个站点中都不同。

#!/usr/bin/bash
#set -euo pipefail
set -u

email="[email protected]"
keep="+14"

#include script
. cronjobs/do_backup.sh

echo Main
#mysql Config File
dbcfg="cronjobs/_dbaccess.cnf"

#Backup using database, group_suffix in cnf file and backup_name
db="zzzcity_directory"
dbgrp="_zzz_directory"
bkp="db_zzz_directory.sql"
backup $db $dbcfg $dbgrp $bkp &>>$msg

#Backup using database, group_suffix in cnf file and backup_name
db="zzzcity_potluck"
dbgrp="_zzz_potluck"
bkp="db_zzz_potluck.sql"
backup $db $dbcfg $dbgrp $bkp &>>$msg

#Maintain backup copies and send email
finalize $keep $email
echo Done

第二个在每个网站上都是相同的。

do_backup.sh

#!/usr/bin/bash

timestamp=$(date +"%F")
backup_dir="backup"
mysqldump="/usr/bin/mysqldump"
stat="/usr/bin/stat"
msg="tmp/backup_msg"

echo "Date:     $(date)" > $msg
echo "Hostname: $(hostname)" >> $msg
echo >> $msg
echo >> $msg
mkdir -p "$backup_dir/$timestamp" 2>> $msg

main() {
  db=$1
  dbcfg=$2
  dbpgrp=$3
  bkp="$backup_dir/$timestamp/$4"
  echo "Backing:  $db"
  echo "To:       $bkp"
  $mysqldump --defaults-extra-file=$dbcfg --defaults-group-suffix=$dbgrp $db > $bkp
  size=$($stat -c%s $bkp)
  echo "Filesize: $size"
  echo
}

backup () {
  main $1 $2 $3 $4
}

finish () {
  keep=$1
  echo "Keeping:  $keep copies"
  echo "Removing excess backups"
  find $backup_dir/ -type d -mtime +$keep -exec rm -r {} +
  echo
  echo "Finished: $(date)"
}

finalize (){
  finish $1 &>>$msg
  mail  -s "MySQL Backup script has run" "$2" <$msg
  #rm -f $MSG
}

进一步解释

  • 它使用 cron 运行,每天凌晨 2 点运行一次
  • 它正在备份 MySQL 数据库并在.cnf文件中进行身份验证
  • 我在名称为备份日期的目录中保留了 14 个副本
  • 最旧的被删除

电子邮件看起来像这样

日期: 2023 年澳大利亚东部时间 5 月 9 日星期二 02:00:02
主机名:zzz

备份:zzzcity_directory
至:backup/2023-05-09/db_zzz_directory.sql
文件大小:6463

支持:zzzcity_potluck
至:backup/2023-05-09/db_zzz_potluck.sql
文件大小:3541

保留:+14 份
删除多余的备份

完成时间:2023 年澳大利亚东部时间 5 月 9 日星期二 02:00:04


问题
目前,电子邮件的主题是静态的。如果有错误我想更改。否则,我必须打开所有电子邮件。由于我已经使用 stderr 来构建电子邮件中的详细信息,因此如何获取某些内容失败的指示?我想到的两个是 mysqldump 或文件系统错误。

相关内容