#!/usr/bin/env bash NAME="" COMMAND_FILE="" ENV_FILE="" MAIL_NOTIFICATION="" PID=$$ USAGE="Usage: `basename $0` [-h] [-n name] [-e env-file] [-m mail-address] COMMAND+" while getopts hn:e:m:N: OPT; do case "$OPT" in h) echo $USAGE exit 1 ;; n) NAME=$OPTARG ;; e) ENV_FILE=$OPTARG ;; m) MAIL_NOTIFICATION=$OPTARG ;; \?) echo $USAGE >&2 exit 1 ;; esac done shift $((OPTIND - 1)) if [ -z "${NAME}" ] ; then echo "A job name is required." >&2 exit 1 fi if [ $# -lt 1 ] ; then echo "A command is required." >&2 exit 1 fi RUN_SCRIPT=$(mktemp) cat < "${RUN_SCRIPT}" #!/bin/sh FN="${RUN_SCRIPT}" JOB_NAME="${NAME}" MAIL_NOTIFICATION="${MAIL_NOTIFICATION}" OUTPUT_FILE=\$(mktemp) TIME_FILE=\$(mktemp) START_TIME=\$(date) EOF if [ -e "${ENV_FILE}" ] ; then cat "${ENV_FILE}" >> "${RUN_SCRIPT}" fi cat <> "${RUN_SCRIPT}" env time -o \${TIME_FILE} $@ 2>&1 | tee \${OUTPUT_FILE} cat \${TIME_FILE} END_TIME=\$(date) EOF if [ ! -z "${MAIL_NOTIFICATION}" ] ; then cat <> "${RUN_SCRIPT}" MESSAGE_FILE=\$(mktemp) cat < "\${MESSAGE_FILE}" Job \${JOB_NAME} has completed. The output is attached. Start time: \${START_TIME} End time : \${END_TIME} Process Time/Usage Statistics: EOM cat "\${TIME_FILE}" >> "\${MESSAGE_FILE}" cat <> "\${MESSAGE_FILE}" FN="${RUN_SCRIPT}" JOB_NAME="${NAME}" MAIL_NOTIFICATION="${MAIL_NOTIFICATION}" ENV_FILE="${ENV_FILE}" EOM mail -s "Job \${JOB_NAME} complete" -a "\${OUTPUT_FILE}" "\${MAIL_NOTIFICATION}" < "\${MESSAGE_FILE}" rm "\${MESSAGE_FILE}" EOF fi cat <> "${RUN_SCRIPT}" rm "\${OUTPUT_FILE}" rm "\${TIME_FILE}" rm "\${FN}" EOF chmod +x ${RUN_SCRIPT} screen -d -S "job-${NAME}" -m ${RUN_SCRIPT}