Задать вопрос
Tkreks
@Tkreks
Системный инженер

Как в powershell закрыть другое окно powershell?

Мне нужен worker, который будет запускать и останавливать python скрипты на винде. Сейчас тестовый стенд Win 10 PRO.
У меня есть API, к которому ps скрипт обращается с некой периодичностью для получения задач и отдает статус. Запуск скриптов py происходит корректно, всё работает, вопросов нет. А вот остановка никак не получается. Логически выглядит так - worker получает задачу на запуск определенного скрипта -> запускает его -> получает id запущенного процесса и сохраняет его -> далее в самом python скрипте устанавливается заголовок окна = Agent for phone XXXXXXXXX -> какое то время всё работает, API само решает когда отдать задачу STOP -> отдаёт задачу STOP. Но далее ничего не происходит
//В скрипте PS могут быть ошметки других наработок где я присваиваю ID процесса в title окна, не обращайте внимания

Скрипт запуска выглядит так -
# Запуск скрипта через PowerShell с названием окна по ID процесса
function Start-Script($phone) {
    $scriptPath = Join-Path $SCRIPT_FOLDER "$phone.py"
    if (Test-Path $scriptPath) {
        # Получаем уникальное название окна на основе ID процесса
        $process = Start-Process -FilePath "powershell.exe" -ArgumentList "-NoExit", "-Command", "cd '$SCRIPT_FOLDER'; Start-Sleep 1; [System.Console]::Title = 'Process_$($PID)'; python $phone.py" -PassThru

        # Сохраняем ID процесса для дальнейшей остановки
        $RUNNING_PROCESSES[$phone] = $process.Id
        Write-Host "Skript $phone.py zapushchen s ID protsessa: $($process.Id)"
    } else {
        Write-Host "Skript $phone.py ne naiden."
    }
}

Всё окей, запускается, питон отрабатывает, но питон работает в цикле пока его не остановить.
Но вот с остановкой возникает проблема, т.к. начинается какая то непонятная мне ерунда.
API отдаёт работу, воркер отрабатывает и запускает скрипт -
Скрин консоли
66e898b1545b0681775470.png

Скрин Process Explorer
66e898c65e0e5489457157.png

Вывод для Get-Process powershell | Format-List *
Обрезал вывод только до одно PID
Name                       : powershell
Id                         : 8664
PriorityClass              : Normal
FileVersion                : 10.0.19041.4522 (WinBuild.160101.0800)
SI                         : 2
Handles                    : 635
VM                         : 2204026601472
WS                         : 71688192
PM                         : 60137472
NPM                        : 30144
Path                       : C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe
Company                    : Microsoft Corporation
CPU                        : 0,828125
ProductVersion             : 10.0.19041.4522
Description                : Windows PowerShell
Product                    : Операционная система Microsoft® Windows®
__NounName                 : Process
BasePriority               : 8
ExitCode                   :
HasExited                  : False
ExitTime                   :
Handle                     : 2308
SafeHandle                 : Microsoft.Win32.SafeHandles.SafeProcessHandle
MachineName                : .
MainWindowHandle           : 1116066
MainWindowTitle            : Agent for 798XXXXXXX


Собственно пока всё правильно. ID нужного мне процесса 8664, это агент, которого когда мне потребуется я должен убить. Сам же воркер работает под ID 5984.

Код, который убивает процесс по пиду в нужный мне момент -
# Остановка скрипта по ID процесса
function Stop-Script($phone) {
    if ($RUNNING_PROCESSES.ContainsKey($phone)) {
        $processId = $RUNNING_PROCESSES[$phone]
        Write-Host "Popitka ostanovit' protsess s ID: $processId dlya skripta $phone.py"

        # Попробуем получить информацию о процессе по ID
        $process = Get-Process -Id $processId -ErrorAction SilentlyContinue
        if ($process) {
            Stop-Process -Id $processId -Force
            Write-Host "Protsess ostanovlen."
        } else {
            Write-Host "Protsess s ID $processId ne naiden."
        }

        # Удаляем процесс из списка
        $RUNNING_PROCESSES.Remove($phone)
    } else {
        Write-Host "Skript $phone.py ne zapushchen ili ID protsessa ne naiden."
    }
}


Собственно дальше происходит непонятно, я отдаю команду на остановку процесса 8664, и процесс останавливается.
Вывод консоли
66e8994ec395c190935100.png


Показания PE говорят что родительский процесс запущен, а дочерних нет
66e899c55555e842041302.png

Однако, я всё еще вижу вторую
консоль PS
66e89a6b9c1b0249529780.png

Но в процессах у меня висит только один процесс PS.
Скрин с сортировкой по имени
66e89adb87d5e655159216.png

Вопрос в том, как мне убить\завершить второе окно ?
  • Вопрос задан
  • 302 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@MaxKozlov Куратор тега PowerShell
На ваших скринах видно, что питон (11104) всё ещё работает. Консолька, видимо, ждёт когда дочерний процесс закроется. При этом в процессах консоль уже не отображается, встречал подобное.

Но зачем так сложно ? почему не запускать сразу питон и уже с ним работать ?
И ещё видно, что питон запускает хром с селениумом, так что тут целое дерево убивать надо.

Гораздо логичнее выставлять флажок скрипту (файлик писать куда-нибудь, например, kill-pid-11104), видя который, питон сам себя корректно завершит, безо всяких убийств
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы