#!/bin/sh set +eu . /etc/rc.sh ||: set -eu usage() { cat <<-'EOF' Usage: cronjob COMMAND... EOF } if [ -z "${1:-}" ]; then printf 'Missing COMMAND.\n\n' >&2 usage >&2 exit 2 fi duration() { minutes=$((${1} / 60)) seconds=$((${1} % 60)) printf '%sm%ss' "$minutes" "$seconds" } CMD="$*" HOSTNAME="$(hostname)" FROM="cronjob@$HOSTNAME" TIMEOUT='10800' # three hours STATUS_F="$(mkstemp)" OUT="$(mkstemp)" email() { { cat <<-EOF Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: $FROM To: root@localhost Subject: (exit status: $(cat "$STATUS_F")) - $HOSTNAME: $CMD EOF cat "$OUT" } | sendmail -t -f "$FROM" rm -f "$OUT" "$STATUS_F" } trap email EXIT { cat <<-EOF Running commad: $CMD Starting at: $(timestamp -E) EOF START="$(now)" STATUS=0 timeout "$TIMEOUT" "$@" || STATUS=$? printf '%s' "$STATUS" > "$STATUS_F" END="$(now)" DURATION_SECONDS=$((END - START)) cat <<-EOF Finished at: $(timestamp -E) Duration: $(duration "$DURATION_SECONDS") EOF } 2>&1 | pre "$(printf '[%s]: %s\n' "$CMD")" | ts '%Y-%m-%dT%H:%M:%S' | tee "$OUT" >> /var/log/cronjobs.log