Come riavviare Interbase
-
22-09-2019 - |
Domanda
cerco di seguire http://edn.embarcadero.com/article/28604 per il riavvio Interbase. Ecco il codice:
program IBRestart;
{$APPTYPE CONSOLE}
uses
SysUtils, winsvc;
var
vManager, vService: SC_Handle;
vtmp: TServiceStatus;
begin
vManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if vManager > 0 then
begin
vService := OpenService(vManager, 'InterBaseGuardian', SERVICE_START or SERVICE_STOP);
if vService = 0 then // vService is always 0 here, why ?
CloseServiceHandle(vManager)
else
if ControlService(vService, SERVICE_CONTROL_STOP, vTmp) and
QueryServiceStatus(vService, vTmp) and
(vTmp.dwCurrentState = SERVICE_STOPPED) then
begin
WriteLn('Success');
end;
end;
end.
Ho notato che il servizio è elencato come "gds_db InterBase 2009 Guardian" finestra di dialogo nei servizi. Ho provato diverse varianti di questo come argomento per OpenService senza successo ... Eventuali suggerimenti?
Modifica Lista net start il servizio come InterBase 2009 Guardiano gds_db e InterBase 2009 Server gds_db
RaiseLastOSError restituire questo in entrambi i casi: Progetto IBRestart.exe ha sollevato un'eccezione di classe EOSError con il messaggio 'Errore di sistema. Codice:. 1060. Il servizio specificato non esiste come un servizio installato'
Quindi vService è sempre 0 nel codice sopra. Ho anche cercare di fermare un altro servizio come temi e funziona in realtà. Può essere gli spazi nella stringa che deve essere speciale gestito? Ho cercato di chiudere Amministrazione di IIS e restituito lo stesso messaggio di errore come Interbase fare.
Soluzione
Questo è il file batch che uso per il riavvio InterBase 2007, ti mostra che su alcune macchine i nomi dei servizi hanno uno spazio supplementare in loro :
rem jpl: 20071015 - on some machines, the guardian service has an extra space
net stop "InterBase 2007 Guardian gds_db"
net stop "InterBase 2007 Guardian gds_db "
net stop "InterBase 2007 Server gds_db"
net start "InterBase 2007 Guardian gds_db"
net start "InterBase 2007 Guardian gds_db "
pause
Si noti che ho arrestare e avviare il Guardian due volte; a volte non reagisce entro la fermata del servizio / inizio periodo di timeout. Ho anche arresto il servizio InterBase specifico; è difficilmente necessaria, ma ho avuto un periodo in cui il servizio di guardiano si è fermata, ma il servizio InterBase non si fermò.
- Jeroen
Altri suggerimenti
Forse il nome del servizio è sbagliato o non si hanno abbastanza diritti (necessità di avviare come amministratore)? Difficile da dire, senza alcun suggerimento di quanto è andato storto.
Si prega di verificare se una delle chiamate segnalare un errore (codice di ritorno = 0) e controllare che cosa l'errore è chiamando RaiseLastOSError o SysErrorMessage (GetLastError) in quel caso. Assicuratevi anche di controllare gli errori sulle altre chiamate. Si prega di aggiornare la tua domanda con tutte le nuove informazioni che porta.
e cambiare il tuo assegno da> 0 a <> 0. 0 errore di segnali, niente altro successo. Una maniglia può essere un numero negativo. E aggiungere un po try..finally. E non dimenticate il codice per avviare di nuovo il servizio :) Inoltre si potrebbe prendere un po 'prima che il servizio cambia stato dopo una chiamata al ControlService così QueryServiceStatus potrebbe restituire SERVICE_STOP_PENDING per un po' prima di poter realmente fermarsi. Il codice dovrebbe conto. Vedere qui per un esempio.
program IBRestart;
{$APPTYPE CONSOLE}
uses
SysUtils, winsvc;
var
vManager, vService: SC_Handle;
vtmp: TServiceStatus;
begin
vManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if vManager <> 0 then
begin
try
vService := OpenService(vManager, 'InterBaseGuardian', SERVICE_START or SERVICE_STOP);
if vService = 0 then // vService is always 0 here, why ?
RaiseLastOSError; // This will give a hint why !
else
try
Win32Check(ControlService(vService, SERVICE_CONTROL_STOP, vTmp));
Win32Check(QueryServiceStatus(vService, vTmp));
if vTmp.dwCurrentState = SERVICE_STOPPED then // This might also be SERVICE_STOP_PENDING
WriteLn('Success')
else
WriteLn('Failure');
finally
CloseServiceHandle(vService);
end;
finally
CloseServiceHandle(vManager);
end;
end
else
RaiseLastOSError;
end.
Guardiano è un servizio che riavviare il Ibserver.exe quando cadono: e 'stato utile per il vecchio sistema operativo o quando si esegue ibserver come applicazione. Se si utilizza ibserver come un servizio, è possibile gestire questo direttamente al servizio (Guardian è inutile in questo caso).