aboutsummaryrefslogtreecommitdiff
path: root/etc/sh/cronjob.sh
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2023-03-13 10:04:33 -0300
committerEuAndreh <eu@euandre.org>2023-03-13 10:06:10 -0300
commitf00b68077e634f75b4b27670d74d37fbc4287544 (patch)
tree89eb7cade2f47e6d0f8bef557c667ae0926314ac /etc/sh/cronjob.sh
parentetc/nix/configuration.nix: Configure postfix to redirect local emails to euan... (diff)
downloaddotfiles-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-xetc/sh/cronjob.sh62
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