Сам сервер запускается в Execute так
- Код: Выделить всё
LogToFile('Running http server.....');
FHttpServer := TFPHttpServer.Create(nil);
FHttpServer.Port := CurrentSettings.AppPort; //9080;
FHttpServer.UseSSL := true;
FHttpServer.OnRequest:= @DoHandleRequest;
FHttpServer.CertificateData.Certificate.FileName := 'certificate.crt';
FHttpServer.CertificateData.PrivateKey.FileName := 'privateKey.key';
FHttpServer.Threaded := true;
LogToFile('Running http server (Active:= true) .....');
repeat // сделано для проверки
FHttpServer.Active:= true; // это запускается и работает
LogToFile('Http server is run.'); // сюда уже не доходит
until Terminated; // сюда уже не доходит
LogToFile('Exit from repeat ');
Остановка делается отдельной процедурой
- Код: Выделить всё
procedure TCliSvr.StopServer;
begin
LogToFile('Stopping HTTP server...');
if Assigned(FHttpServer) then
begin
FHttpServer.Active:=False;
//FreeAndNil(FHttpServer); // сначала было так, потом перенес в деструктор класса
LogToFile('FreeAndNil(FHttpServer) ');
end;
LogToFile('Done StopServer');
end;
деструктор класса
- Код: Выделить всё
begin
// Nothing to do here, just for logging
FHttpServer.Free;
LogToFile('Daemon worker thread destroyed');
inherited Destroy;
end;
Запуск и остановка демона фактически взяты в вики
- Код: Выделить всё
procedure TDaemonCliSvr.DataModuleStart(Sender: TCustomDaemon; var OK: Boolean);
begin
LogToFile(Format('Daemon received start signal, PID:%d', [GetProcessID]));
// Create a suspended worker thread - see DaemonWorkerThread unit
FCliSvr := TCliSvr.Create;
// Parametrize it
FCliSvr.FreeOnTerminate := False;
// Start the worker
FCliSvr.Start;
end;
procedure TDaemonCliSvr.DataModuleStop(Sender: TCustomDaemon; var OK: Boolean);
begin
try
LogToFile('Daemon received stop signal');
// stop and terminate the worker
if assigned(FCliSvr) then
begin
FCliSvr.Terminate;
sleep(100); // добавлено от безыходности :))
FCliSvr.StopServer;
sleep(100); // добавлено от безыходности :))
// Wait for the thread to terminate.
LogToFile('prepare FCliSvr.WaitFor'); // на этом виснет при первом нажатии Ctrl+C
FCliSvr.WaitFor;
LogToFile('prepare FreeAndNil(FCliSvr)');
FreeAndNil(FCliSvr); // если закомментировать FCliGalSvrThread.WaitFor' то завис тут
end;
LogToFile('Daemon stopped'); // сюда приходит после двух трех Ctrl+C
Halt;
OK := True;
except
on E: Exception do begin
writeln('Exception: HasError '+E.ToString);
LogToFile('Exception: HasError '+E.ToString);
end;
end;
Для отладки пробую запускать приложение под sudo c ключом -r (пример с закомментированным FCliSvr.WaitFor;)
- Код: Выделить всё
..../Cli/ServerService$ sudo ./CliSrv -r
13:06:09 Daemon received start signal, PID:9975
13:06:09 Daemon worker thread created
13:06:09 Running http server.....
13:06:09 Running http server (Active:= true) .....
Try connect to: database
Connection is established
^C13:06:27 Daemon received stop signal // первое нажатие Ctrl+C
13:06:27 Stopping HTTP server...
13:06:27 FreeAndNil(FHttpServer)
13:06:27 FreeAndNil(FilesSaver)
13:06:27 Done StopServer
13:06:28 prepare FreeAndNil(FCliGalSvrThread)
13:06:28 Daemon worker thread destroyed // ЗАВИСАНИЕ, но судя по логу деструктор отработал
^C13:06:51 Daemon received stop signal // второе нажатие Ctrl+C
13:06:51 Daemon stopped
.../Cli/ServerService$
помогите разобраться, как это победить