簡體   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