bash 是否有可用的内置缓存命令(有点像 mktemp 或海绵)?

cwd*_*cwd 7 command-line bash cache amazon-ec2

我正在使用 amazon ec2 命令行工具,该ec2-describe-instances工具有点痛苦,因为它需要 2-5 秒才能发出请求并显示输出。

我正在研究使用此问题中描述的fec2din工具来格式化输出的格式,并且想知道缓存调用输出的最佳方法是什么。ec2-describe-instances

fec2din用于mktemp创建临时文件,然后用于awk格式化输出。

是否有一些工具可以与 TTL 参数一起使用,该工具仅ec2-describe-instances在缓存文件上的时间戳早于某个时间时才运行?

如果有一些实用程序可以做到这一点(就像sponge帮助stdout)一样,那就太好了。

Ste*_*pel 1

虽然这并不能解决您的问题,但我强烈建议通过优秀的boto使用Amazon EC2,这是一个提供 Amazon Web Services 接口的 Python 包

\n\n

它几乎涵盖了与Amazon EC2 API 工具相同的内容,但不会因为依赖现代且快速的 AWS REST API 而遭受痛苦的延迟,而EC2 API 工具是用 Java 编写的并用于使用旧且缓慢的 SOAP API(不知道他们是否已经在这方面改变了方向,但您的经验以及仍然需要的AWS X.509 证书似乎表明情况并非如此)。

\n\n

此外,您不再需要使用这些AWS X.509 证书,而是可以通过AWS 访问密钥 IDAWS 秘密访问密钥使用当今更常见和灵活的方法,这也可能(并且通常应该)通过AWS Identity and Access Management (IAM)提供,以避免暴露您的主 AWS 账户凭证。

\n\n

最重要的是,boto显然是通过 Python 脚本编排您日常 AWS 使用的候选者 - 当然也可以使用它来完成bash,但您明白了;)

\n\n

文档

\n\n

您可以在boto: A Python interface to Amazon Web Services中找到文档和示例,它提供了不错的(即或多或少完整的)API 参考(例如针对EC2)以及专门的介绍性文章,解释了几种服务的基本用法(但不包括还没有),例如boto\xe2\x80\x99s EC2 接口简介涵盖了当前的用例。

\n\n

此外,您可能需要阅读Boto Config来设置您的环境(凭据等)。

\n\n

用法

\n\n

您可以通过 Python Read\xe2\x80\x93eval\xe2\x80\x93print 循环 (REPL)探索boto,即通过启动.python

\n\n

一旦您对片段感到满意,您可以将它们转换为 Python 脚本以供独立使用。

\n\n

例子

\n\n

以下是一个大约解决您的用例的示例(假设您已在环境中设置了凭据,如Boto Config中所述):

\n\n\n\n
$ python\nPython 2.7.2 (default, Jun 12 2011, 14:24:46)\nType "help", "copyright", "credits" or "license" for more information.\n>>> import boto\n>>> ec2 = boto.connect_ec2()\n>>> instances = ec2.get_all_instances()\n>>> instances\n[Reservation:r-916d01f2, Reservation:r-3f7e055c, Reservation:r-c37209a0]\n
Run Code Online (Sandbox Code Playgroud)\n\n

好的,实际上返回了boto.ec2.instance.Reservationget_all_instances()的列表,所以这里有一个烦人的间接寻址(源于 EC2 API),您通常不会在其他地方看到它 - 文档已经是结论性的,但是让\让我们看看如何通过内省找出答案:

\n\n
>>> dir(instances[0])\n[\'__class__\', \'__delattr__\', \'__dict__\', \'__doc__\', \'__format__\', \'__getattribute__\', \n\'__hash__\', \'__init__\', \'__module__\', \'__new__\', \'__reduce__\', \'__reduce_ex__\', \n\'__repr__\', \'__setattr__\', \'__sizeof__\', \'__str__\', \'__subclasshook__\', \'__weakref__\', \n\'connection\', \'endElement\', \'groups\', \'id\', \'instances\', \'item\', \'owner_id\', \n\'region\', \'startElement\', \'stop_all\']\n>>> insts = instances[0].instances\n>>> insts\n[Instance:i-5d9a593a]\n
Run Code Online (Sandbox Code Playgroud)\n\n

更像是这样,所以最后您想查看以下属性值i-5d9a593a(为了简洁和隐私,省略了大多数属性):

\n\n
>>> vars(insts[0])\n{\'kernel\': u\'aki-825ea7eb\', \'private_dns_name\': \'\', \'id\': u\'i-5d9a593a\', \n\'monitored\': False, \'state\': u\'stopped\', \'architecture\': u\'x86_64\',  \n \'public_dns_name\': \'\', \'ip_address\': None, \'placement\': u\n\'us-east-1a\', \'ami_launch_index\': u\'0\', \'dns_name\': \'\', \'region\': RegionInfo:us-east-1\n# ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

不完全是这样,但 Python 的数据漂亮打印机(pprint)可以拯救:

\n\n
>>> import pprint\n>>> pp = pprint.PrettyPrinter(indent=4)\n>>> pp.pprint(vars(insts[0])) {   \n    \'_in_monitoring_element\': False,\n    \'ami_launch_index\': u\'0\',\n    \'architecture\': u\'x86_64\',\n    \'dns_name\': \'\',\n    \'hypervisor\': u\'xen\',\n    \'id\': u\'i-5d9a593a\',\n    \'instance_class\': None,\n    \'instance_type\': u\'m1.medium\',\n    \'ip_address\': None,\n    \'kernel\': u\'aki-825ea7eb\'\n    # ...\n    }\n
Run Code Online (Sandbox Code Playgroud)\n