-
Notifications
You must be signed in to change notification settings - Fork 5
/
tdarr_node_killer.sh
79 lines (71 loc) · 3.33 KB
/
tdarr_node_killer.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/bin/bash
# ============================================================
# Script Name: Plex Transcoding & Docker Management Script
# Author: Admin9705 & Reddit
# Description:
# This script monitors Plex transcoding activity on a specified
# GPU device. If Plex is detected using the GPU, it resets a
# restart counter. If Plex does not use the GPU for a defined
# number of checks, it increments a counter. Once the counter
# reaches a threshold, the script restarts a specified Docker
# container. The script is designed to run indefinitely and
# includes logging for monitoring and troubleshooting.
# ============================================================
# NOTE: Requires Tautulli
# ============================================================
#!/bin/bash
# Configuration
TAUTULLI_API_KEY="dad9bbb78bde43249754b630b58fbf6a" # Tautulli API Key
TAUTULLI_URL="http://10.0.0.10:8181/api/v2" # Tautulli URL
WAIT_SECONDS=180 # Wait time (seconds) to bring docker container back up when it was stopped
BASIC_CHECK=3 # Check Plex Activity intervals (seconds) when not playing
CONTAINER_NAME="N1" # Exact of your Tdarr Node that you want stopped
# Function to check if Plex is transcoding via Tautulli
is_plex_transcoding() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - Checking Plex activity via Tautulli API"
response=$(curl -s "${TAUTULLI_URL}?apikey=${TAUTULLI_API_KEY}&cmd=get_activity")
# Count how many sessions are transcoding
transcoding_count=$(echo "$response" | jq '[.response.data.sessions[]?.transcode_decision == "transcode"] | map(select(. == true)) | length')
if [ "$transcoding_count" -gt 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Plex is currently transcoding $transcoding_count session(s)."
return 0
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - No Plex transcoding detected."
return 1
fi
}
# Function to check if the container is running
is_container_running() {
state=$(docker inspect -f '{{.State.Running}}' "${CONTAINER_NAME}" 2>/dev/null)
if [ "$state" = "true" ]; then
return 0
else
return 1
fi
}
while true; do
if is_plex_transcoding; then
# Plex is transcoding, ensure container is not running
if is_container_running; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Killing Docker container ${CONTAINER_NAME} due to Plex transcoding."
docker kill "${CONTAINER_NAME}"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - ${CONTAINER_NAME} is already stopped."
fi
# Wait before checking again
echo "$(date '+%Y-%m-%d %H:%M:%S') - Sleeping for ${WAIT_SECONDS} seconds..."
sleep "${WAIT_SECONDS}"
else
# Plex is not transcoding
# Check if container is running, if not, start it
if ! is_container_running; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Starting Docker container ${CONTAINER_NAME} since Plex is not transcoding."
docker start "${CONTAINER_NAME}"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') - ${CONTAINER_NAME} is already running, no action needed."
fi
# Sleep before next check
echo "$(date '+%Y-%m-%d %H:%M:%S') - Sleeping for ${BASIC_CHECK} seconds..."
sleep "${BASIC_CHECK}"
fi
done