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中以存储为可靠的变量,然后将它们打印在正确的位置?或者更广泛地说,我该如何改进呢?
答案 0 :(得分: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
。