[英]SSM send-command with Powershell does not complete until background job finishes
我正在使用 SSM 发送命令在 Windows EC2 实例上启动 Tomcat 进程。
例如:
aws ssm send-command --instance-id i-xxxx --document-name "AWS-RunPowerShellScript"
--parameters 'commands=["startup.bat"]'
这确实启动了 Tomcat 但我注意到 SSM 命令调用本身一直卡在进行中,直到我最终关闭 Tomcat 为止,此时它立即成功。
我的预感是 SSM 在任何衍生的子进程上运行 Powershell 块的方式(在 Tomcat 的情况下start java...
)。 不过,我不认为这是 Tomcat 甚至 Java 所独有的。
有没有办法让 Powershell 退出,让子进程在后台运行?
如果您想在 PowerShell 中启动一个独立进程- 即使在创建进程终止后仍保持活动状态 - 使用Start-Process
cmdlet:
Start-Process aws -ArgumentList @'
send-command --instance-id i-xxxx --document-name AWS-RunPowerShellScript --parameters commands=["startup.bat"]
'@
注意使用(文字) here-string ( @'<newline>...<newline>'@
)使嵌入引号更容易; 有关 PowerShell 字符串文字的信息,请参阅此答案的底部。
虽然-ArgumentList
可以接受 arguments数组,但从 PowerShell 7.0 开始,这些转换为命令行的方式被破坏(并且由于向后兼容性问题可能无法修复;请参阅此 ZD3B7C913CD04EBFECZ0E9EC32CB6FD58 )。
因此,最好使用带有嵌入式引用的单个参数。
请注意,在调用外部程序(例如本例中的aws
)时,您应该只使用双引号 ( "
)作为参数分隔符。 [1]
[1] 通过直接调用外部程序,您可以自由使用任何一种引用样式,因为 PowerShell 在后台重建命令行时,仅使用"
来引用 arguments(如果需要的话)。在这种情况下的Start-Process
, -ArgumentList
值被传递到 .NET API ( System.Diagnostics.ProcessStartInfo
),其中不执行此类转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.