У меня есть сервер Delphi, который запускает скрипты Python в фоновом режиме (они работают аналогично "python Sync.py **params**
").
Эти сценарии могут выполнять такие действия, как подключение к внешним серверам, открывать ssh-соединения и делать страшные вещи, где они могут зависать.
Мне нужно обнаружить, если они висят, и убить его. Кроме того, если сервер закрыт, и вы хотите завершить процесс (в противном случае сервер Delphi зависает, исчезает с рабочего стола, но становится невидимым в фоновом режиме. Эта проблема возникает позже, если сервер запускается снова).
Сначала попробуйте не работать. Процесс будет убит, но если я закрою приложение, сервер зависнет.
Таким образом, вопрос в том, существует ли более надежный / лучший способ убить дочерний процесс.
Теперь я сохраняю их дескриптор и их GetTickCount, например: «handle = tickcount», затем запускаю их с TTimer каждые 4 секунды и проверяю, истекло ли время ожидания процесса:
procedure TfrmMain.CheckProcess(Sender: TObject);
var
i: Integer;
Fecha:TDateTime;
start, stop, elapsed,Handle : cardinal;
begin
stop := GetTickCount;
for i := (FProcesos.Count - 1) downto 0 do
begin
start := StrToInt( FProcesos.ValueFromIndex[i] );
elapsed := stop - start; //milliseconds
//Esta muerto el proceso??
if ((elapsed>TIMEOUT_PROCESS) or (FTimer.Enabled=False)) then
begin
Handle := StrToInt( FProcesos.Names[i] );
TerminateProcess(Handle,0);
CloseHandle( Handle );
FProcesos.Delete( i );
LogMsg('A process timed out!',msgError);
end;
end;//for
end;