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