Команда SSM send с Powershell не завершается, пока не завершится фоновое задание - PullRequest
2 голосов
/ 11 апреля 2020

Я использую команду SSM send для запуска процесса Tomcat на экземпляре Windows EC2.

, например:

aws ssm send-command --instance-id i-xxxx --document-name "AWS-RunPowerShellScript"
   --parameters 'commands=["startup.bat"]'

Это действительно запускает Tomcat, но я заметил, что Сам вызов команды SSM застрял в процессе, пока я в конечном итоге не отключил Tomcat, и в этот момент он сразу же завершился успешно.

Я догадываюсь, что SSM запускает блоки Powershell в любых порожденных дочерних процессах (start java ... в случай Tomcat). Я не думаю, что это уникально для Tomcat или даже Java.

Есть ли способ заставить Powershell завершить работу, оставив дочерние процессы в фоновом режиме?

1 Ответ

1 голос
/ 11 апреля 2020

Если вы хотите запустить независимый процесс в PowerShell - тот, который остается в живых даже после завершения процесса создания - используйте Start-Process cmdlet:

Start-Process aws -ArgumentList @'
send-command --instance-id i-xxxx --document-name AWS-RunPowerShellScript --parameters commands=["startup.bat"]
'@

Обратите внимание на использование (буквального) здесь-строки (@'<newline>...<newline>'@) для упрощения вложения кавычек; см. нижний раздел этого ответа для получения информации о строковых литералах PowerShell.

В то время как -ArgumentList может принимать массив аргументов, как они переведенная в командную строку не работает с PowerShell 7.0 (и, вероятно, не будет исправлена ​​из-за проблем обратной совместимости; см. эту проблему GitHub ).

Следовательно, лучше использовать одиночный аргумент с встроенными кавычками .

Обратите внимание, что следует использовать только двойные кавычки (") в качестве разделителей аргументов при вызове внешних программ (например, aws в данном случае). [1]


[1] При прямом вызове внешней программы вы можете использовать любой стиль цитирования, потому что PowerShell, когда он перестраивает командную строку за кулисами, использует только " для цитирования аргументов (если нужно вообще). В случае Start-Process значение -ArgumentList передается в API. NET (System.Diagnostics.ProcessStartInfo), где такой перевод не выполняется.

...