我从多个网站支持小型数据库,并向管理员发送包含结果的电子邮件。我已经指示 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 或文件系统错误。