了解命令状态
Run Command 是 AWS Systems Manager 的一项功能,报告关于处理过程中命令经历的不同状态以及处理该命令的每个托管式节点的详细状态信息。您可以使用以下方法监控命令状态:
-
在 Run Command 控制台界面的 Commands(命令)选项卡上选择 Refresh(刷新)图标。
-
使用 AWS Command Line Interface (AWS CLI) 调用 list-commands 或 list-command-invocations。或者,使用 AWS Tools for Windows PowerShell 调用 Get-SSMCommand 或 Get-SSMCommandInvocation。
-
配置 Amazon EventBridge 以响应状态或状态更改。
-
将 Amazon Simple Notification Service (Amazon SNS) 配置为发送所有状态更改或特定状态(例如
Failed
或TimedOut
)的通知。
Run Command 状态
Run Command 报告以下三个区域的状态详情:插件、调用和总体命令状态。插件是在命令的 SSM 文档中定义的代码执行数据块。有关插件的更多信息,请参阅 命令文档插件参考。
在将一条命令同时发送给多个托管式节点时,针对每个节点的命令的每个副本均为一个命令调用。例如,如果您使用 AWS-RunShellScript
文档并将一个 ifconfig
命令发送到 20 个 Linux 实例,则该命令具有 20 个调用。每个命令调用都会单独报告状态。给定命令调用的插件也会单独报告状态。
最后,Run Command 包含适用于所有插件和调用的聚合命令状态。聚合命令状态可能不同于插件或调用报告的状态,如下表所述。
注意
如果您使用 max-concurrency
或 max-errors
参数在大量托管式节点上运行命令,则命令状态会反映这些参数施加的限制,如下表所述。有关这些参数的更多信息,请参阅 大规模运行命令。
Status | 详细信息 |
---|---|
待处理 | 命令尚未发送到托管式节点,或者 SSM Agent 尚未接收到此类命令。如果代理在等于 Timeout (seconds) (超时 (秒)) 参数和 Execution timeout (执行超时) 参数总和的时间长度之前没有收到命令,则状态将更改为 Delivery Timed Out (传输超时)。 |
InProgress | Systems Manager 正在尝试将命令发送到托管式节点,或者 SSM Agent 已接收到此类命令并且命令已开始在实例上运行。根据所有命令插件的结果,状态会变为 Success (成功)、Failed (失败)、Delivery
Timed Out (传输超时) 或 Execution Timed Out (执行超时)。例外:如果代理未在节点上运行或在节点上不可用,则在代理再次可用或达到执行超时限制之前,命令状态将保持为 In
Progress (正在进行)。随后,状态会更改为最终状态。 |
延迟 | 系统尝试向托管式节点发送命令,但未成功。系统再次重试。 |
成功 | 在各种条件下都会返回此状态。此状态并不意味着命令已在节点上得到处理。例如,由于您的 PowerShell ExecutionPolicy 阻止命令运行,因此在托管式节点上,SSM Agent 可接收到命令,而且命令返回为零的退出代码。这是最终状态。导致命令返回 Success 状态的条件是:
注意当以资源组为目标时,同样的条件也适用。要解决错误或获取有关命令执行的更多信息,请通过返回适当的退出代码 (针对命令失败的非零退出代码) 来发送一个处理错误或异常的命令。 |
DeliveryTimedOut | 命令未在总超时过期之前传输到托管式节点。总超时不计入父命令的 max-errors 限制,但是有助于区别父命令的状态是 Success (成功)、Incomplete (未完成)还是 Delivery Timed Out (传输超时)。这是最终状态。 |
ExecutionTimedOut | 命令自动化在托管式节点上开始,但是命令未在执行超时过期之前完成。执行超时算作失败,这样就会发送一个非零回复,Systems Manager 将退出运行命令自动化的尝试,并报告失败状态。 |
失败 | 托管式节点上的命令失败。对于插件,这表示结果代码不为 0。对于命令调用,这表示一个或多个插件的结果代码不为 0。调用失败不计入父命令的 max-errors 限制。这是最终状态。 |
已取消 | 命令在完成之前被取消。这是最终状态。 |
无法传输 | 命令无法传输到托管式节点。节点可能不存在或可能未响应。无法传输的调用不计入父命令的 max-errors 限制,但是有助于区别父命令的状态是 Success (成功) 还是 Incomplete (未完成)。(例如,如果命令中的所有调用具有 Undeliverable (无法传输) 状态,则返回的命令状态为 Failed (失败)。不过,如果命令具有 5 个调用,其中的 4 个调用返回 Undeliverable (无法传输) 状态,一个调用返回 Success (成功) 状态,则父命令的状态为 Success (成功)。这是最终状态。 |
已终止 | 父命令超过其 max-errors 限制且系统取消了后续命令调用。这是最终状态。 |
InvalidPlatform | 命令被发送到与所选文档指定的所需平台不匹配的托管式节点。Invalid
Platform (无效平台)不计入父命令的最大错误数限制,但是有助于区别父命令的状态是 Success(成功)还是 Failed(失败)。(例如,如果命令中的所有调用具有 Invalid Platform (无法传输) 状态,则返回的命令状态为 Failed (失败)。不过,如果命令具有 5 个调用,其中的 4 个调用返回 Invalid Platform (无法传输) 状态,一个调用返回 Success (成功) 状态,则父命令的状态为 Success (成功)。这是最终状态。 |
AccessDenied | 启动命令的 AWS Identity and Access Management (IAM) 用户或角色无权访问目标托管式节点。Access Denied (拒绝访问)不计入父命令的 max-errors (最大错误数)限制,但是有助于区别父命令的状态是 Success (成功)还是 Failed (失败)。(例如,如果命令中的所有调用具有 Access Denied (无法传输) 状态,则返回的命令状态为 Failed (失败)。不过,如果命令具有 5 个调用,其中的 4 个调用返回 Access Denied (无法传输) 状态,一个调用返回 Success (成功) 状态,则父命令的状态为 Success (成功)。这是最终状态。 |
Status | 详细信息 |
---|---|
待处理 | 任何托管式节点上的代理都尚未收到命令。 |
InProgress | 命令已发送到至少一个托管式节点,但是在所有节点上都未达到最终状态。 |
延迟 | 系统尝试向节点发送命令,但未成功。系统再次重试。 |
成功 | 命令由所有指定的或设为目标的托管式节点上的 SSM Agent 接收,并返回了一个为零的退出代码。所有命令调用都已达到最终状态,且未达到 max-errors 的值。此状态并不意味着命令已在所有指定的或设为目标的托管式节点上成功得到处理。这是最终状态。注意要解决错误或获取有关命令执行的更多信息,请通过返回适当的退出代码 (针对命令失败的非零退出代码) 来发送一个处理错误或异常的命令。 |
DeliveryTimedOut | 命令未在总超时过期之前传输到托管式节点。max-errors 值或更多命令调用显示 Delivery Timed
Out 状态。这是最终状态。 |
失败 |
托管式节点上的命令失败。 |
未完成 | 已尝试在所有托管式节点上执行命令,且一个或多个调用不具有 Success (成功)值。不过,调用失败的次数不足以使状态变为 Failed 。这是最终状态。 |
已取消 | 命令在完成之前被取消。这是最终状态。 |
RateExceeded | 作为命令目标的托管式节点数量超出了待处理调用的账户配额。系统在任何节点上执行命令之前取消了命令。这是最终状态。 |
AccessDenied | 启动命令的用户或角色无权访问目标资源组。AccessDenied 不计入父命令的 max-errors 限制,但是有助于区别父命令的状态是 Success 还是 Failed 。(例如,如果命令中的所有调用具有 AccessDenied (拒绝访问) 状态,则返回的命令状态为 Failed (失败)。不过,如果命令具有 5 个调用,其中的 4 个调用返回 AccessDenied (拒绝访问) 状态,1 个调用返回 Success (成功) 状态,则父命令的状态为 Success (成功)。) 这是最终状态。 |
在标签中没有实例 | 作为命令目标的标签密钥对值或资源组与任何托管式节点都不匹配。这是最终状态。 |
了解命令超时值
在运行命令时,Systems Manager 强制执行以下超时值。
总超时
在 Systems Manager 控制台中,您可以在 Timeout (seconds)(超时(秒))字段中指定超时值。发送命令后,Run Command 会检查命令是否已过期。如果命令达到命令过期限制(总超时),它会将所有状态为 InProgress
(正在进行)、Pending
(待处理) 或 Delayed
(延迟) 的调用的状态更改为 DeliveryTimedOut
(传输超时)。
在更深的技术层面上,总超时(Timeout (seconds)(超时(秒)))是两个超时值的总和,如下所示:
Total timeout = "Timeout(seconds)" from the console + "timeoutSeconds": "{{
executionTimeout }}" from your SSM document
例如,在 Systems Manager 控制台中,Timeout (seconds) (超时 (秒)) 的默认值是 600 秒。如果使用 AWS-RunShellScript
SSM 文档运行命令,则 "timeoutSeconds": "{{ executionTimeout }}" 的默认值为 3600 秒,如以下示例文档所示:
"executionTimeout": { "type": "String", "default": "3600", "runtimeConfig": { "aws:runShellScript": { "properties": [ { "timeoutSeconds": "{{ executionTimeout }}"
这意味着,在系统将命令状态设置为 DeliveryTimedOut
之前,该命令运行了 4200 秒(70 分钟)。
执行超时
在 Systems Manager 控制台中,您可以在 Execution Timeout (执行超时) 字段中指定执行超时值(如果可用)。并非所有 SSM 文档都要求指定执行超时值。Execution Timeout(执行超时)字段仅在 SSM 文档中定义了相应的输入参数时才会显示。如果已指定该值,则命令必须在此时段内完成。
注意
Run Command 依靠 SSM Agent 文档最终响应来确定命令是否已传输给代理。SSM Agent 必须发送一个 ExecutionTimedOut
信号,才能将调用或命令标记为 ExecutionTimedOut
。
默认执行超时
如果 SSM 文档不要求您明确指定执行超时值,则 Systems Manager 会强制执行硬编码的默认执行超时。
Systems Manager 如何报告超时
如果 Systems Manager 收到来自目标上的 SSM Agent 的 execution timeout
回复,则 Systems Manager 会将命令调用标记为 executionTimeout
。
如果 Run Command 没有收到 SSM Agent 文档最终响应,则命令调用被标记为 deliveryTimeout
。
为了确定目标的超时状态,SSM Agent 将合并 SSM 文档的所有参数和内容来计算 executionTimeout
。如果 SSM Agent 确定某条命令已超时,它会向服务发送 executionTimeout
。
Timeout (seconds) (超时 (秒)) 的默认值为 3600 秒。Execution Timeout (执行超时) 的默认值也为 3600 秒。因此,命令的总超时默认为 7200 秒。
注意
SSM Agent 采用不同的方式处理 executionTimeout
,具体取决于 SSM 文档的类型和文档版本。