Как «тайм-аут» функция так, чтобы она проводится только один раз каждые 5 секунд EventHough, его называют несколько раз в секунду

см. Ниже:

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
0
задан 10 March 2021 в 11:56

1 ответ

Вы можете создать промежуточную функцию для отслеживания времени. Если 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..
0
ответ дан 18 March 2021 в 23:27

Другие вопросы по тегам:

Похожие вопросы: