PMSCheck.sh 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #!/bin/bash
  2. # Build URL and cURL opts
  3. source ~/bin/video/pms/curl.sh
  4. # Config
  5. RETRY_DELAY=30
  6. RESTART_DELAY=600
  7. UNWATCHED_SECTION="28"
  8. UNWATCHED_SLEEP=30
  9. UNWATCHED_RETRIES=3
  10. MIN_UNWATCHED_COUNT=5
  11. MAX_MEM=$(( 14 * 1024 * 1024 )) # GB in kB
  12. ADMIN_EMAIL="zach@kotlarek.com"
  13. IFS=''
  14. # Command-line config
  15. LOOP=-1
  16. if [ "${1}" ]; then
  17. LOOP="${1}"
  18. fi
  19. # Run at least once, loop if requested
  20. while [ $LOOP -ne 0 ]; do
  21. # State tracking
  22. FAILED=""
  23. # Ensure the media share is mounted
  24. if [ -z "${FAILED}" ]; then
  25. if ! ~/bin/video/isMediaMounted; then
  26. FAILED="Media share not mounted"
  27. fi
  28. fi
  29. # Ask Plex for the top-level status page
  30. if [ -z "${FAILED}" ]; then
  31. PAGE="`curl ${CURL_OPTS[@]} "${PMS_URL}/"`"
  32. if [ -z "${PAGE}" ]; then
  33. FAILED="HTTP timeout"
  34. else
  35. UPDATE="`echo "${PAGE}" | grep 'updatedAt=' | sed 's%^.*updatedAt="\([0-9]*\)".*$%\1%'`"
  36. if [ -z "${UPDATE}" ]; then
  37. FAILED="Invalid update timestamp on status page"
  38. fi
  39. fi
  40. fi
  41. # Ask Plex for a list of unwatched TV series
  42. if [ -z "${FAILED}" ]; then
  43. TRY=1
  44. FAILED="Too few unwatched series"
  45. UNWATCHED_URL="${PMS_URL}/library/sections/${UNWATCHED_SECTION}/all?type=2&unwatched=1"
  46. UNWATCHED_URL+="&X-Plex-Container-Start=0&X-Plex-Container-Size=$(( $MIN_UNWATCHED_COUNT + 2 ))"
  47. while [ $TRY -le $UNWATCHED_RETRIES ]; do
  48. PAGE="`curl ${CURL_OPTS[@]} "${UNWATCHED_URL}" 2>&1`"
  49. COUNT="`echo "${PAGE}" | grep '</Directory>' | wc -l | awk '{print $1}'`"
  50. if [ $COUNT -ge $MIN_UNWATCHED_COUNT ]; then
  51. FAILED=""
  52. break
  53. fi
  54. sleep $RETRY_DELAY
  55. FAILED="${FAILED} ${COUNT}"
  56. TRY=$(( $TRY + 1 ))
  57. done
  58. fi
  59. # Check Plex's memory usage
  60. if [ -z "${FAILED}" ]; then
  61. MEM="`ps awx -o vsize,comm | awk '$0 ~ /\/Plex Media Server$/ {print $1}'`"
  62. if [ -z "${MEM}" ]; then
  63. FAILED="Unable to read memory use"
  64. fi
  65. if [ $MEM -gt $MAX_MEM ]; then
  66. FAILED="Memory use too high: ${MEM}/${MAX_MEM} kB"
  67. fi
  68. fi
  69. # If Plex has failed kill it
  70. if [ -n "${FAILED}" ]; then
  71. ERR_MSG="PMS is non-responsive (${FAILED}). Killing..."
  72. echo "${ERR_MSG}" 1>&2
  73. ~/bin/video/pms/killPMS.sh
  74. if [ $LOOP -lt 1 ]; then
  75. exit 1
  76. elif [ -n "${ADMIN_EMAIL}" ]; then
  77. echo -e "Subject: PMS Restart\n\n${ERR_MSG}" | sendmail "${ADMIN_EMAIL}"
  78. fi
  79. # Give plex a breather to get restarted before we check again
  80. sleep "${RESTART_DELAY}"
  81. fi
  82. # Sleep for the next loop or exit
  83. if [ $LOOP -gt 0 ]; then
  84. sleep $LOOP
  85. else
  86. exit 0
  87. fi
  88. done