#!/bin/bash ## ## Wrapper Script for Cronscripts ## Log all errors and stdout and sends only once a day an email ## ## (c) Alexander Sulfrian, Sep 2008 ## echo_error() { echo "$@" 1>&2 } create_and_check_log() { if [ ! -e "${1}" ] then touch "${1}" fi if [ ! -w "${1}" ] then echo_error "Unable to open log: ${1}" exit 2 fi } if [ -z "${1}" -o ! -x "${1}" ] then echo_error echo_error " Usage:" echo_error " ${0} filename [parameter]" echo_error echo_error " The filename have to exists an have to be executable." echo_error exit 1 fi CRON_SCRIPT="${1}" CRON_SCRIPT_BASENAME="$(basename ${CRON_SCRIPT} ".sh")" CRON_SCRIPT_LOGNAME="${CRON_SCRIPT_BASENAME#sync-}" ERROR_LOG="/var/log/sync/${CRON_SCRIPT_LOGNAME}_error.log" LOG="/var/log/sync/${CRON_SCRIPT_LOGNAME}.log" LOCKFILE="/var/lock/${CRON_SCRIPT_LOGNAME}" create_and_check_log "${ERROR_LOG}" create_and_check_log "${LOG}" ERROR_TMP=$(mktemp -t "${CRON_SCRIPT_BASENAME}.XXXXXXXX") # parameter eins nach vorne shiften # damit der cronscript dateiname nicht mehr enthalten ist shift 1 # locking, cron script should not executed while the last # instance is running lockfile-create "$LOCKFILE" || exit 1 lockfile-touch "$LOCKFILE" & TOUCH="$!" # log header LOG_HEADER="-------------------- $(date) --------------------" echo "${LOG_HEADER}" >> "${LOG}" # cron ausführen und output auffangen ${CRON_SCRIPT} $@ >> "${LOG}" 2> "${ERROR_TMP}" if [ $(grep -v "^\s*$" "${ERROR_TMP}" | wc -l) -gt 0 ] then if [ "$(date -r${ERROR_LOG} +%F)" != "$(date +%F)" ] then cat "${ERROR_LOG}" echo "${LOG_HEADER}" cat "${ERROR_TMP}" echo -n > "${ERROR_LOG}" else echo ${LOG_HEADER} >> "${ERROR_LOG}" cat "${ERROR_TMP}" >> "${ERROR_LOG}" fi fi rm "${ERROR_TMP}" # cleanup lockfile kill "$TOUCH" lockfile-remove "$LOCKFILE"