Мне нужен 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 отдаёт работу, воркер отрабатывает и запускает скрипт -
Вывод для Get-Process powershell | Format-List *
Обрезал вывод только до одно PIDName : 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, и процесс останавливается.
Показания PE говорят что родительский процесс запущен, а дочерних нет
Однако, я всё еще вижу вторую
Но в процессах у меня висит только один процесс PS.
Скрин с сортировкой по имени
Вопрос в том, как мне убить\завершить второе окно ?