Я использую этот сценарий для ежедневного резервного копирования LDAP с помощью cronjob. Можно ли изменить сценарий, чтобы отправлять электронное письмо только в случае ошибки.
Копия электронного письма отправляется ежедневно
* Create data directory: /var/backups/ldap/ldap/2011.09/27.
* Backup completed successfully.
+ Data: /var/backups/ldap/ldap/2011.09/27/2011.09.27.04.01.01.ldif*
+ Log: /var/backups/ldap/logs/2011.09/ldap-2011.09.27.04.01.01.log
Скрипт LDAP
#########################################################
# Modify below variables to fit your need ----
#########################################################
# Where to store backup copies.
#BACKUP_ROOTDIR='/backup'
BACKUP_ROOTDIR='/var/backups/ldap'
# Compress plain SQL file: YES, NO.
COMPRESS="YES"
# Delete plain LDIF files after compressed. Compressed copy will be remained.
DELETE_PLAIN_LDIF_FILE="YES"
#########################################################
# You do *NOT* need to modify below lines.
#########################################################
export PATH="$PATH:/usr/sbin:/usr/local/sbin/"
# Commands.
CMD_DATE='/bin/date'
CMD_DU='du -sh'
CMD_COMPRESS='bzip2 -9'
if [ -f /etc/ldap/slapd.conf ]; then
export CMD_SLAPCAT='slapcat -f /etc/ldap/slapd.conf'
elif [ -f /etc/openldap/slapd.conf ]; then
export CMD_SLAPCAT='slapcat -f /etc/openldap/slapd.conf'
elif [ -f /usr/local/etc/openldap/slapd.conf ]; then
export CMD_SLAPCAT='slapcat -f /usr/local/etc/openldap/slapd.conf'
else
export CMD_SLAPCAT='slapcat'
fi
# Date.
export MONTH="$(${CMD_DATE} +%Y.%m)"
export DAY="$(${CMD_DATE} +%d)"
export DATE="$(${CMD_DATE} +%Y.%m.%d.%H.%M.%S)"
export BACKUP_SUCCESS='NO'
#########
# Define, check, create directories.
#
# Backup directory.
export BACKUP_DIR="${BACKUP_ROOTDIR}/ldap/${MONTH}/${DAY}"
export BACKUP_FILE="${BACKUP_DIR}/${DATE}.ldif"
# Logfile directory. Default is /backup/logs/YYYY.MM/.
export LOG_DIR="${BACKUP_ROOTDIR}/logs/${MONTH}"
# Check and create directories.
if [ ! -d ${BACKUP_DIR} ]; then
echo "* Create data directory: ${BACKUP_DIR}."
mkdir -p ${BACKUP_DIR}
fi
if [ ! -d ${LOG_DIR} ]; then
echo "* Create log directory: ${LOG_DIR}."
mkdir -p ${LOG_DIR} 2>/dev/null
fi
# Log file. Default is /backup/logs/YYYY.MM/mysql-YYYY.MM.DD.log.
LOGFILE="${LOG_DIR}/ldap-${DATE}.log"
############
# Initialize log file.
#
echo "* Starting backup: ${DATE}." >${LOGFILE}
echo "* Backup directory: ${BACKUP_DIR}." >>${LOGFILE}
echo "* Log file: ${LOGFILE}." >>${LOGFILE}
##############
# Backing up
#
echo "* Dumping LDAP data into file: ${BACKUP_FILE}..." >>${LOGFILE}
${CMD_SLAPCAT} > ${BACKUP_FILE}
if [ X"$?" == X"0" ]; then
export BACKUP_SUCCESS='YES'
fi
# Compress plain SQL file.
if [ X"${COMPRESS}" == X"YES" ]; then
echo "* Compressing LDIF file with command: '${CMD_COMPRESS}' ..." >> ${LOGFILE}
${CMD_COMPRESS} ${BACKUP_FILE} >>${LOGFILE} 2>&1
if [ X"$?" == X"0" ]; then
echo "* [DONE]" >>${LOGFILE}
# Delete plain LDIF file after compressed.
if [ X"${DELETE_PLAIN_LDIF_FILE}" == X"YES" -a -f ${BACKUP_FILE} ]; then
echo -n "* Removing plain LDIF file: ${BACKUP_FILE}..." >>${LOGFILE}
rm -f ${BACKUP_DIR}/*.ldif >>${LOGFILE} 2>&1
[ X"$?" == X"0" ] && echo -e "\t[DONE]" >>${LOGFILE}
fi
fi
fi
# Append file size of backup files.
echo "* File size:" >>${LOGFILE}
echo "=================" >>${LOGFILE}
${CMD_DU} ${BACKUP_FILE}* >>${LOGFILE}
echo "=================" >>${LOGFILE}
echo "* Backup completed (Successfully: ${BACKUP_SUCCESS})." >>${LOGFILE}
if [ X"${BACKUP_SUCCESS}" == X"YES" ]; then
cat <<EOF
* Backup completed successfully.
EOF
else
echo -e "\n* Backup completed with !!!ERRORS!!!.\n" 1>&2
fi
cat << EOF
+ Data: ${BACKUP_FILE}*
+ Log: ${LOGFILE}
EOF
Cron отправит электронное письмо только в том случае, если из задания был выведен stderr или stdout. Вы уже выводите большую часть своего вывода в файл журнала, но эти 4 строки не перенаправляются, поэтому вы всегда будете получать отчет cron.
Я бы переместил этот блок
cat << EOF
+ Data: ${BACKUP_FILE}*
+ Log: ${LOGFILE}
EOF
в ваше состояние "else", так что только echo
s во время состояния ошибки, затем удалите два эха, которые возникли до того, как вы определили LOGFILE
(или сохраните эти два сообщения и поместите их в файл журнала после того, как вы его определили.
Пока успешная переадресация все вывод в файл журнала, тогда вы получите почту только в случае ошибки.