см. Ниже:
still_notify=false
has_been_notified=false
notify()
{
$has_been_notified && return
watching=$(if [[ $(GET http://$ipplexserver:32400/status/sessions?X-Plex-Token=$plexapitoken | grep -o "^</Video>$") ]]; then echo true; else echo false; fi)
if [[ $watching = false ]]
then
clear
echo "Updating notification"
echo "--------------------------------"
echo "Nobody is watching media on your plex server anymore"
echo "You can now update plex"
echo "-----"
echo "You see this message because you chose to be notified when you were trying to update plex"
echo "--------------------------------"
sed -i "s|^still_notify=true$|still_notify=false|" $filelocation/advancedplexapi.sh
read -rp "continue | update: " notifyoption
if [[ ${notifyoption,,} = "continue" ]]
then
echo "this is to exit out of the if statement" >> /dev/null
elif [[ ${notifyoption,,} = update ]]
then
option=update
fi
has_been_notified=true
fi
}
if [[ $still_notify = true ]]
then
trap notify DEBUG
fi
if [[ if-statement ]]
then
sed -i "s|^still_notify=false$|still_notify=true|" $filelocation/advancedplexapi.sh
trap notify DEBUG
fi
Это Система уведомлений внутри моего скрипта. Когда нижние, если оператор запускается, скрипт продолжается, но в фоновом режиме он проверяет Plex API, и если IF-оператор является TRUE, он показывает сообщение. Это проверяет API (см. Просмотр переменной) Каждый раз, когда команды выполняются в сценарии (из-за отладки, используемой в команде ловушки). Мой скрипт настолько больший (2800 строк), что запускает функцию уведомления несколько раз в секунду (иногда 10x в секунду). Это делает мой сценарий Невероятно медленно (из-за количества запросов API), иногда даже непригодных, и функция даже не должна бегать так много раз.
Я хочу иметь его, чтобы функция была запущена, она не может Будьте в течение следующих 5 секунд, независимо от того, сколько раз его называют командой ловушки. Как сон / тайм-аут для функции. Я попробовал следующее, но это не сработало:
timeout=false
still_notify=false
has_been_notified=false
notify()
{
if [[ $timeout = false ]]
then
sed -i "s|^timeout=false$|timeout=true|" $filelocation/advancedplexapi.sh
$has_been_notified && return
watching=$(if [[ $(GET http://$ipplexserver:32400/status/sessions?X-Plex-Token=$plexapitoken | grep -o "^</Video>$") ]]; then echo true; else echo false; fi)
if [[ $watching = false ]]
then
clear
echo "Updating notification"
echo "--------------------------------"
echo "Nobody is watching media on your plex server anymore"
echo "You can now update plex"
echo "-----"
echo "You see this message because you chose to be notified when you were trying to update plex"
echo "--------------------------------"
sed -i "s|^still_notify=true$|still_notify=false|" $filelocation/advancedplexapi.sh
read -rp "continue | update: " notifyoption
if [[ ${notifyoption,,} = "continue" ]]
then
echo "this is to exit out of the if statement" >> /dev/null
elif [[ ${notifyoption,,} = update ]]
then
option=update
fi
has_been_notified=true
fi
}
while true
do
sleep 5s
sed -i "s|^timeout=true$|timeout=false|" $filelocation/advancedplexapi.sh
done &
if [[ $still_notify = true ]]
then
trap notify DEBUG
fi
if [[ if-statement ]]
then
sed -i "s|^still_notify=false$|still_notify=true|" $filelocation/advancedplexapi.sh
trap notify DEBUG
fi
Вы можете создать промежуточную функцию для отслеживания времени. Если Rlimit старше, чем секунду, повторно установите эпоху в переменную Rlimit в глобальном объеме.
#!/bin/bash
debug_func(){
local -n a=rlimit
((($EPOCHSECONDS - a) > 1)) && \
{ a=$EPOCHSECONDS; notify; }
}
trap debug_func DEBUG
notify(){
echo "Ding Dong!"
}
echo 1..
echo 2..
echo 3..
sleep 2
echo 4..