PMSCheck.sh 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #!/bin/bash
  2. # Config
  3. CURL_TIMEOUT=2
  4. DATE_TIMEOUT=600
  5. RESTART_DELAY=60
  6. PMS_URL="http://localhost:32400/"
  7. ADMIN_EMAIL="zach@kotlarek.com"
  8. # Command-line config
  9. LOOP=-1
  10. if [ "${1}" ]; then
  11. LOOP="${1}"
  12. fi
  13. # Run at least once, loop if requested
  14. while [ $LOOP -ne 0 ]; do
  15. # State tracking
  16. FAILED=""
  17. # Ask for the last update time from Plex
  18. UPDATE="`curl --silent --max-time "${CURL_TIMEOUT}" "${PMS_URL}" | \
  19. grep 'updatedAt=' | sed 's%^.*updatedAt="\([0-9]*\)".*$%\1%'`"
  20. # If Plex replied, check the update time
  21. if [ -n "${UPDATE}" ]; then
  22. DATE="`date '+%s'`"
  23. DIFF=$(( $DATE - $UPDATE ));
  24. if [ $DIFF -gt $DATE_TIMEOUT ]; then
  25. FAILED="Update timeout"
  26. fi
  27. else
  28. FAILED="HTTP timeout"
  29. fi
  30. # If Plex has failed kill it
  31. if [ -n "${FAILED}" ]; then
  32. ERR_MSG="PMS is non-responsive (${FAILED}). Killing..."
  33. echo "${ERR_MSG}" 1>&2
  34. killall 'Plex Media Server'
  35. if [ $LOOP -lt 1 ]; then
  36. exit 1
  37. elif [ -n "${ADMIN_EMAIL}" ]; then
  38. echo -e "Subject: PMS Restart\n\n${ERR_MSG}" | sendmail "${ADMIN_EMAIL}"
  39. fi
  40. # Give plex a breather to get restarted before we check again
  41. # (I would love to re-optimize here too, but that's tricky to time efficiently)
  42. sleep "${RESTART_DELAY}"
  43. fi
  44. # Sleep for the next loop or exit
  45. if [ $LOOP -gt 0 ]; then
  46. sleep $LOOP
  47. else
  48. exit 0
  49. fi
  50. done