cURL を使用して tmux 構成のパブリック IP を取得すると、接続が多すぎる

cURL を使用して tmux 構成のパブリック IP を取得すると、接続が多すぎる

現在、次のコマンドcurl icanhazip.comと tmux.conf のオプションを使用してset -g status-left ...、パブリック IP を取得してステータス バーに表示しています。

これは素晴らしい機能ですが、リクエスト数同じIPを取得するために作成されている何度もまた。

質問:

tmux 構成を使用して、セッションごとに 1 つの通信ストリームのみ (または冗長性の少ないもの) でこれを実現 (tmux ステータス バーでパブリック IP を取得/表示) するにはどうすればよいですか?

curl のマニュアル ページを調べ、コマンドでさまざまなレート制限引数を試しましたが、効果はありませんでした。ただし、これは tmux に固有の問題だと思います。

これを実現するために何らかの外部スクリプトまたは関数を使用することもできますが、私はこれをシンプルに保ちたいと思っています。

この問題を解決するための提案や、完全に代替となる方法があれば、ぜひ教えてください。

編集: 書式設定

答え1

情報をキャッシュします:

  1. 5 分または 10 分ごとに実行される cron ジョブを追加します。

    curl http://icanhazip.com > ~/.cache/my-ip
    

    一部のソースは、コネクションレス プロトコル経由でこの情報を提供するため、接続ベースの HTTP ソースほど制限が厳しくありません。

    dig +short myip.opendns.com @208.67.222.222 > ~/.cache/my-ip
    
  2. tmux では、コマンドを変更して、キャッシュ ファイルから読み取るだけにします。

    cat ~/.cache/my-ip
    

これは単一のスクリプトでも実行できますが、だろうそれほど単純ではありません:

#!/usr/bin/env perl
use LWP::Simple;

sub read_cached_ip {
    my ($file) = @_;
    return undef if !-e $file; # check if file exists
    my $mtime = (stat $file)[9];
    return undef if time - $mtime >= 5*60; # check if file has expired
    if (open(my $fh, "<", $file)) {
        chomp(my $ip = <$fh>);
        close($ip);
        return $ip;
    }
    return undef;
}

sub update_ip {
    my ($file) = @_;
    my $ip = LWP::Simple::get("http://icanhazip.com");
    if (open(my $fh, ">", $file)) {
        print $fh "$ip\n";
        close($ip);
    }
    return $ip;
}

my $file = $ENV{HOME}."/.cache/my-ip";
my $ip = read_cached_ip($file) // update_ip($file);
print "$ip\n";

関連情報