2017-02-20 23 views
0

У меня есть несколько сценариев tmux, которые отображают информацию, такую ​​как ip, время, имя хоста и т. Д. В моей строке состояния tmux. Например, IP-скрипт выглядит следующим образом:Как отключить сетевые вызовы, которые делают некоторые мои плагины tmux?

#!/bin/bash 

runSegment() { 
    # check for a network connection 
    nc -z 8.8.8.8 53 >/dev/null 2>&1 
    online=$? 

    if [ $online -eq 0 ]; then 
    # get ip 
    ip=`curl icanhazip.com` 
    echo -n " ${ip}" 
    else 
    echo "" 
    fi 
} 

export -f runSegment 

Он проверяет наличие подключения к сети и получает IP-адрес, если есть один. Теперь моя строка состояния tmux устанавливается на обновление каждые пять секунд (tmux set-option -g status-interval 5). Но сетевые запросы к этим услугам каждые пять секунд кажутся немного чрезмерными.

Тем не менее, я хотел бы сохранить информацию о состоянии батареи и времени, обновляемом каждые пять секунд, поэтому установка интервала состояния до пяти минут или около того не является вариантом.

Итак, как мне получить этот скрипт для возврата кешированного значения, и только через пять минут или около того обновите это значение? Я предполагаю, что мне нужно решить это в bash, но для этого мне нужно иметь внутреннее состояние, и поскольку этот скрипт запускается заново каждый раз, когда я не уверен, как это сделать.

+0

Вы думали о сохранении требуемого состояния с помощью файла (например, что будет содержать метку времени, когда была сделана последняя удачная попытка)? – Fred

+0

@Fred Да, похоже, что это был бы путь. Могу ли я сохранить как метку времени, так и полученное значение в файле, или было бы разумнее сохранить их для разделения файлов? – vsjn3290ckjnaoij2jikndckjb

+0

Вы можете просто использовать время модификации файла как метку времени. – Barmar

ответ

0

Так это работает:

#!/bin/bash 

runSegment() { 
    # check if online and assign exit code to variable 
    nc -z 8.8.8.8 53 >/dev/null 2>&1 
    local online=$? 

    if [ $online -eq 0 ]; then 
    # check how many seconds ago ip was retrieved 
    local lastmod=$(($(date +%s) - $(stat -f%c ~/.current-ip))) 

    # if longer than five minutes ago refresh the value and echo that 
    if [ $lastmod -gt 300 ]; then 
     local ip=$(curl icanhazip.com) 
     echo ${ip} > $HOME/.current-ip 
     echo -n " ${ip}" 

    # otherwise use the cached value 
    else 
     local ip=$(cat $HOME/.current-ip) 
     echo -n " ${ip}" 
    fi 

    # return empty value if there's no connection 
    else 
    echo "" 
    fi 
} 

export -f runSegment 
+0

В строке 'lastmod = echo ...', 'echo' и backticks являются избыточными. Просто сохраните '= $ ((...))'. Также, вообще говоря, вы можете предпочесть использование '$ (command)' вместо обратных ссылок для целей удобочитаемости (хотя обратные ссылки также действительны). – Fred

+0

@Fred Ok обновил его – vsjn3290ckjnaoij2jikndckjb

 Смежные вопросы

  • Нет связанных вопросов^_^