如何限制我的某些tmux插件所做的网络调用?

时间:2017-02-20 15:51:17

标签: bash caching curl tmux

我有几个tmux脚本,在我的tmux状态栏中显示ip,time,hostname等信息。例如,ip脚本如下所示:

#!/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中解决这个问题,但我需要有内部状态,并且每当我不确定如何处理它时,这个脚本会重新运行。

1 个答案:

答案 0 :(得分: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