diff options
author | EuAndreh <eu@euandre.org> | 2023-03-13 10:04:33 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2023-03-13 10:06:10 -0300 |
commit | f00b68077e634f75b4b27670d74d37fbc4287544 (patch) | |
tree | 89eb7cade2f47e6d0f8bef557c667ae0926314ac /etc/sh/cronjob.sh | |
parent | etc/nix/configuration.nix: Configure postfix to redirect local emails to euan... (diff) | |
download | dotfiles-f00b68077e634f75b4b27670d74d37fbc4287544.tar.gz dotfiles-f00b68077e634f75b4b27670d74d37fbc4287544.tar.xz |
Embed with-email(1) into cronjob(1) and improve its reporting
Diffstat (limited to 'etc/sh/cronjob.sh')
-rwxr-xr-x | etc/sh/cronjob.sh | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/etc/sh/cronjob.sh b/etc/sh/cronjob.sh index 31e7b28..5a2eb70 100755 --- a/etc/sh/cronjob.sh +++ b/etc/sh/cronjob.sh @@ -66,9 +66,67 @@ shift $((OPTIND - 1)) set +e -# shellcheck disable=1090 +# shellcheck source=/dev/null . ~/.profile set -e + +epoch() { + awk 'BEGIN { srand(); print(srand()) }' +} + +now() { + date '+%Y-%m-%dT%H:%M:%S%:z' +} + +pre() { + # Same as: + # sed -u "s|^|[$CMD]: |" + # but the "-u" option is not POSIX + while read -r line; do + printf '[%s]: %s\n' "$CMD" "$line" + done +} + +duration() { + minutes=$((${1} / 60)) + seconds=$((${1} % 60)) + printf '%sm%ss' "$minutes" "$seconds" +} + + CMD="$*" -with-email -s "$(hostname): $CMD" -- nice -n15 "$@" 1>>"$XDG_LOG_HOME"/euandreh/mcron.log 2>&1 +HOSTNAME="$(hostname)" +ONE_HOUR='3600' +STATUS_F="$(mkstemp)" +OUT="$(mkstemp)" + +send_email() { + FROM="cronjob@$HOSTNAME" + TO='root@localhost' + SUBJECT="(exit status: $(cat "$STATUS_F")) - $HOSTNAME: $CMD" + email -s "$SUBJECT" -f "$FROM" "$TO" < "$OUT" + rm -f "$OUT" "$STATUS_F" +} +trap send_email EXIT + +{ + cat <<-EOF + Running command: $CMD + Start at: $(now) + + EOF + + START="$(epoch)" + STATUS=0 + timeout "$ONE_HOUR" "$@" || STATUS=$? + printf '%s' "$STATUS" > "$STATUS_F" + END="$(epoch)" + DURATION_SECONDS=$((END - START)) + + cat <<-EOF + + Finished at: $(now) + Duration: $(duration "$DURATION_SECONDS") + EOF +} 2>&1 | pre | ts '%Y-%m-%dT%H:%M:%S' | tee "$OUT" >> "$XDG_LOG_HOME"/cronjobs.log |