background-job 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/usr/bin/env bash
  2. NAME=""
  3. COMMAND_FILE=""
  4. ENV_FILE=""
  5. MAIL_NOTIFICATION=""
  6. PID=$$
  7. USAGE="Usage: `basename $0` [-h] [-n name] [-e env-file] [-m mail-address] COMMAND+"
  8. while getopts hn:e:m:N: OPT; do
  9. case "$OPT" in
  10. h)
  11. echo $USAGE
  12. exit 1
  13. ;;
  14. n)
  15. NAME=$OPTARG
  16. ;;
  17. e)
  18. ENV_FILE=$OPTARG
  19. ;;
  20. m)
  21. MAIL_NOTIFICATION=$OPTARG
  22. ;;
  23. \?)
  24. echo $USAGE >&2
  25. exit 1
  26. ;;
  27. esac
  28. done
  29. shift $((OPTIND - 1))
  30. if [ -z "${NAME}" ] ; then
  31. echo "A job name is required." >&2
  32. exit 1
  33. fi
  34. RUN_SCRIPT=$(mktemp)
  35. cat <<EOF > "${RUN_SCRIPT}"
  36. #!/bin/sh
  37. FN="${RUN_SCRIPT}"
  38. JOB_NAME="${NAME}"
  39. MAIL_NOTIFICATION="${MAIL_NOTIFICATION}"
  40. OUTPUT_FILE=\$(mktemp)
  41. TIME_FILE=\$(mktemp)
  42. START_TIME=\$(date)
  43. EOF
  44. if [ -e "${ENV_FILE}" ] ; then
  45. cat "${ENV_FILE}" >> "${RUN_SCRIPT}"
  46. fi
  47. cat <<EOF >> "${RUN_SCRIPT}"
  48. env time -o \${TIME_FILE} $@ 2>&1 | tee \${OUTPUT_FILE}
  49. cat \${TIME_FILE}
  50. END_TIME=\$(date)
  51. EOF
  52. if [ ! -z "${MAIL_NOTIFICATION}" ] ; then
  53. cat <<EOF >> "${RUN_SCRIPT}"
  54. MESSAGE_FILE=\$(mktemp)
  55. cat <<EOM > "\${MESSAGE_FILE}"
  56. Job \${JOB_NAME} has completed. The output is attached.
  57. Start time: \${START_TIME}
  58. End time : \${END_TIME}
  59. Process Time/Usage Statistics:
  60. EOM
  61. cat "\${TIME_FILE}" >> "\${MESSAGE_FILE}"
  62. cat <<EOM >> "\${MESSAGE_FILE}"
  63. FN="${RUN_SCRIPT}"
  64. JOB_NAME="${NAME}"
  65. MAIL_NOTIFICATION="${MAIL_NOTIFICATION}"
  66. ENV_FILE="${ENV_FILE}"
  67. EOM
  68. mail -s "Job \${JOB_NAME} complete" -a "\${OUTPUT_FILE}" "\${MAIL_NOTIFICATION}" < "\${MESSAGE_FILE}"
  69. rm "\${MESSAGE_FILE}"
  70. EOF
  71. fi
  72. cat <<EOF >> "${RUN_SCRIPT}"
  73. rm "\${OUTPUT_FILE}"
  74. rm "\${TIME_FILE}"
  75. rm "\${FN}"
  76. EOF
  77. screen -d -S ${NAME} -m ${RUN_SCRIPT}