1

API は、すべてを含む XML ファイルで応答します。その XML のデータの一部を conky の一部に表示したい

データを取得して解析するための bash スクリプトがあります。のように見えます

#!/bin/sh
if [ -z $1 ]; then
        echo "missing arguments"
        exit 0;
fi
curl -s http://example.com/api.php | xmllint --xpath "//${1}/text()" -

そして.conkyrcに私が持っている

${color slate grey}Number of cats: ${color }
${execi 3600 myscript.sh cats}

${color slate grey}Color of the day: ${color }
${execi 3600 myscript.sh color}

${color slate grey}Some other stuff: ${color }
${execi 3600 myscript.sh stuff}

これは正常に機能ますが、必要なすべてのデータが最初に渡されたにもかかわらず、間隔ごとに API に 3 つのリクエストを行っています。

明らかな解決策は、bash スクリプトを変更して、API 応答をタイムスタンプ付きの一時ファイルに保存することです。スクリプトが実行される場合は常に、最初に一時ファイルのタイムスタンプをチェックして、それが古くなっている (または存在しない) かどうかを確認します。その場合は、それを削除して、新しい curl リクエストを作成してください。そうでない場合は、curl ステートメントを

cat tempfile.xml | xmllint

しかし、一時ファイルをあちこちに残したり、潜在的な競合状態を心配したりするのは好きではありません。スクリプトから必要なすべてのデータを返し、それを conky に渡して conky 変数として保存し、適切な場所に出力する方法はありますか? もっと広く言えば、これを改善するにはどうすればよいですか?

4

1 に答える 1

1

キャッシュを使用するようにスクリプトを変更できます。

#!/bin/sh

CACHE_FILE=/var/cache/api.data

check_missing_arg() {
    if [ -z "$1" ]; then
        echo "missing arguments"
        exit 0
    fi
}

if [ "$1" = --use-cache ] && [ -f "$CACHE_FILE" ]; then
    shift
    check_missing_arg "$@"
    xmllint --xpath "//${1}/text()" "$CACHE_FILE"
elif [ "$1" = --store-cache ]; then
    shift
    check_missing_arg "$@"
    curl -s http://example.com/api.php > "$CACHE_FILE"
    xmllint --xpath "//${1}/text()" "$CACHE_FILE"
else
    check_missing_arg "$@"
    curl -s http://example.com/api.php | xmllint --xpath "//${1}/text()" -
fi

そしてあなたの.conkyrc

${color slate grey}Number of cats: ${color }
${execi 3600 myscript.sh --store-cache cats}

${color slate grey}Color of the day: ${color }
${execi 3600 myscript.sh --use-cache color}

${color slate grey}Some other stuff: ${color }
${execi 3600 myscript.sh --use-cache stuff}
  • にキャッシュを書き込むといいかもしれませんtmpfs。一部のディストリビューションは/dev/shm、デフォルトで としてマウントされていますtmpfs
于 2014-08-04T17:29:44.813 に答える