繁体   English   中英

在后台作业完成之前,带有 Powershell 的 SSM 发送命令不会完成

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM