Firebird Szolgáltatás figyelése
2008-11-14T14:18:30+01:00
2010-05-05T03:53:27+02:00
2022-07-19T09:51:13+02:00
mandula
Sziasztok !

Kerestem ilyen Topic-ot, de hiába...
Nem tudja valaki, hogyan lehetne figyelni a Firebird szolgáltatás állapotát/meglétét?

Meg kellene oldanom valahogyan, hogy ha valaki leállítja a szervert, vagy azon a firebird-öt, akkor a hozzá kapcsolódó kliens exe-ék maguktól azonnal leálljanak, és így NE fagyjanak ki ha "kirántják alóluk a talajt"...
(mondjuk ekkor egy EVENT-et küldenék szét... nem tud ilyet a firebird alapból?)

Esetleg visszatartani valahogy a gépleállást 30 másodpercig, amíg a klienseken megjelenik egy
"VIGYÁZAT a szerver leáll! Mentsem? igen/NEM 30..29..28....

Köszi előre is a válaszokat!

Ui.: persze jó lenne első lépésben lecsekkolni, hogy telepítve van-e a firebird szolgáltatás az adott gépen a program indításakor... néha az okos júzerek "tévedésből" uninstallálják...
Mutasd a teljes hozzászólást!
Valoban rossz felöl közelited meg a problémát.A probléma a szerver(ek) leallitasa,a kliensek leallasa csak a kovetkezmeny.Tehat szvsz a szervereknel kene garazdalkodnod.

Megoldas 01.
elcsórod a leallitas menupontot a start menubol

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
Itt letrehozol egy kulcsot Neve NoClose TipusReg_Dword erteke 1 és csak kijelentkezes menupont maradt.

Megoldas 02.
Figyeled a win uzeneteit es ha leallitas van kozbeavatkozol


unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private procedure WMQueryEndSession (var Msg : TWMQueryEndSession) ; message WM_QueryEndSession; Procedure WMEndSession (var Msg : TWMEndSession) ; message WM_ENDSESSION; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //Amikor a felhasználó, vagy valamilyen alkalmazás a Windows-ból //való kilépésről, vagy újraindításról rendelkezik, //akkor az alkalmazások a WM_QURYENDSESSION eseményt kapják. //Ekkor eldönthetik, hogy engedélyezik-e a kilépést, //vagy nem. //Ez az esemény azonban pont emiatt nem közli az alkalmazással egyértelműen, //hogy a Windows befejezi futását, csak azt, hogy be szeretné fejezni. // Itt megakadalyozhato a leallitas is vagy kuldhetsz //uzit,majd ha vegeztel kodbol leallitod magad a szervert //forras softwareonline http://www.softwareonline.hu/Article/View.aspx?id=1224 procedure TForm1.WMQueryEndSession (var Msg : TWMQueryEndSession) ; begin if MessageDlg('Windows leállitása ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then Msg.Result := 0 else Msg.Result := 1 ; end; //****************************************************** //Van azonban még egy üzenet, a WM_ENDSESSION, //amit viszont már akkor kap az alkalmazás, //amikor már biztos, hogy a Windows kilép. //Ehhez az üzenethez kell egy eljárást készíteni, //ami a szükséges feladatokat végrehajtja a program bezárása előtt. // procedure TForm1.WMEndSession (var Msg : TWMEndSession) ; begin if Msg.EndSession = TRUE then ShowMessage('Windows is shutting down ' + #10#13 + 'at ' + FormatDateTime('c', Now)) ; inherited; end; end.
Mutasd a teljes hozzászólást!

  • Nem tudja valaki, hogyan lehetne figyelni a Firebird szolgáltatás állapotát/meglétét?

    Try //adatbázis művelet Except //Hibaüzenet a usernek ShowMessage('Rúgd segbe az admint, mert kikapcsolta a szervert a looser.'); End;
    Mutasd a teljes hozzászólást!
  • Nem tuti megoldás, de én így nézem meg a telepítővel, hogy fent van-e a firebird

    function FBDetect(): Boolean; begin Result := FileExists(IncludeTrailingBackslash(SystemDir)+'gds32.dll'); end;
    Ha igazzal tér vissza akkor kliensként biztosan telepítve van.


    function FBRun(): Boolean; stdcall; begin Result := False; if FindWindow('FB_Server', nil) <> 0 then Result := True; // FB1.5 if FindWindow('FB_Guard', nil) <> 0 then Result := True; // FB1.5 if FindWindow('IB_Server', nil) <> 0 then Result := True; // FB1.0 or Interbase end;
    Ha ez tér vissza igazzal akkor a szerver jelenleg is fut a helyi gépen.

    Eseményeket pedig lehet kiküldeni, de csak commit-nál kapják meg a felhasználók (ha jól tudom).

    Mutasd a teljes hozzászólást!
  • Hát senki sem tudja?
    Mutasd a teljes hozzászólást!
  • Köszi, ez már fél megoldás, bár a fontosabb kérdés még mindig az, hogy hogyan lehetne a leállást "előre" észlelni és jelezni...
    Mutasd a teljes hozzászólást!
  • SEHOGY!

    Nálunk erre az a működő megoldás van rendszerbe állítva, hogy nem szoktuk egy hirtelen jött ötlettől vezérelve csak úgy leállítgatni a szervert.

    VIGYÁZAT a szerver leáll! Mentsem? igen/NEM 30..29..28....

    Jó erős szerveretek van a több mint 30mp mire leáll az FB.
    Ha a vinyókra hosszabb kábelt teszel abban marad még annyi áram hogy még 5 percig működni fog.
    Mutasd a teljes hozzászólást!

  • hmmm... nagyon vicces! mondd ezt annak a kb 150 júzernek, akik 2-4 gépes környezetben használják a rendszert szerte az országban.
    Mert én hiába mondom el nekik, akkoris kikapcsolják a szervert hazamenet előtt, pedig másik szobában/emeleten még dolgoznak...
    Úgyhogy légyszi ne viccelődjetek, hanem segítsetek kidolgozni egy jó szisztémát ennek elkerülésére !

    Csak nem lehet annyira nehéz?
    Mutasd a teljes hozzászólást!
  • Szia.

    Az itt a probléma, hogy humán-erőforrás függő a történet. A firebird nem tudja érzékelni, hogy kikapcs. van folyamatban ezért event-et se fogsz tudni küldeni. Egyetlen megoldás talán az lehet,ha minden szerverre egy jó nagy táblát teszel: "A rendszer ekkor és ekkor automatikusan leáll. Kérlek ne kapcsold ki a gépet!" Ezek után írsz egy kis progit ami bekapcsoláskor elindul és a beállított időpontban meg leállítja a gépet.

    Mutasd a teljes hozzászólást!
  • ... mondd ezt annak a kb 150 júzernek ... hiába mondom el nekik, akkoris kikapcsolják a szervert hazamenet előtt ...


    Gondolom ekkora ügyfélkör kiszolgálása mellett már nem marad elegendő pénz egy 3 négyzetméteres gipszkartonnal elkerített kulcsra zárható helységre ...

    Valószínű, hogy ezeket is olvasgattad már...
    Mutasd a teljes hozzászólást!
  • A kioldó és azon belül a post_event a Tűzmadárnál INSERT, UPDATE, DELETE (előtt,után) kerül végrehajtásra. A shutdown ezek közül melyiket generálja?
    Mutasd a teljes hozzászólást!
  • Des-nek igaza van ! Hacsak tényleg nem tudsz valami undocumented rejtett before_shutdown firebird triggerről
    Én mondjuk találtam valami ilyesmit a FB2.0 source-ban, de szerintem CSAK belső változó és kívülről elérhetetlen.

    Az eventekkel meg semmi bajom, remekül fut velük a progi... csak nem ez volt a kérdés, de azért köszi a próbálkozást!


    Egyébként pedig 2 (max 4) géphez minek is 3 négyzetméteres külön gipszkartonozás???
    Mutasd a teljes hozzászólást!
  • Szia!
    Igen, valóban mindig a júzerekkel van a probléma... mennyivel egyszerűbb lenne a programozás nélkülük...

    ÁmDeAzonban mégiscsak ki kellene találni valami okosságot, hogy ha a kasszás kislány leállítja a gépet, akkor az irodában bezárkózó főnökúr ne kapjon szívritmuszavart az elveszett 5 órás munkája miatt.

    Igazából valami olyasmin jár az eszem, hogy nem is a firebird szolgáltatás leállását kellene figyelni, hanem a windows leállását egy külön kis TRAY-progival, ami visszatartaná legalább 10 másodpercig a shutdown-t...
    Persze lehet, hogy nem lehet megoldani, mert addig amíg ő egyedül nem áll le, attól még a többi szolgáltatás (Pl firebird) leállna...
    Mutasd a teljes hozzászólást!
  • Szia!

    Szerintem olyan problémákat feszegetsz, amelyeknek az oka ugyan teljesen világos, de nem feltétlenül a program oldaláról kellene megoldani - mivel részben ott lehetetlen is. Egész egyszerűen nem a program felelőssége lenne az ilyen esetek lekezelése, amelyik user ezt nem veszi tudomásul, az az ő baja. Irreálisan sok időbefektetéssel lehet tudsz valami nagyon félmegoldást összehozni, pl a szerveren egy állandóan futó alkalmazás, ami kilövése esetén üzenetet küld a klienseknek. Ha sima alkalmazás, akkor elméletileg hamarabb leáll, mint a szolgáltatások (FB), így még az OnClose eseményében eléred az adatbázist és tudsz kommunikálni, de lesz az egészre kb 2 másodperc... Emiatt szerintem eleve értelmetlen az egész, tudatosítani kell a userekben, hogy a gépet nem kapcsoljuk ki, amíg valaki dolgozik, ha pedig mégis megteszik, akkor az már legyen az ő bajuk. Ne akarjuk már a hegyet odavinni Mohammedhez...

    Old sharky: úgy tűnik félreértetted, de a 150 user 2-4 gépes hálózatokon van, azaz van néhány "szerver", kicsit sokat kellene hozzá gipszkartonozni...

    Jah, és a "before shutdown" triggerrel annyi a baj, hogy az FB-nek kevesebb mint 1 mp kell a leállásához, tehát ha tudna is üzenetet küldeni a klienseknek, akkor sem tudnának már a TÁROL gombra kattintani. Ilyen tekintetben részletkérdés, hogy egy FB EVENT-ből jön rá, hogy nincs szerver, vagy a következő adatbázisműveletnél fellépő kivételből.
    Mutasd a teljes hozzászólást!
  • Valoban rossz felöl közelited meg a problémát.A probléma a szerver(ek) leallitasa,a kliensek leallasa csak a kovetkezmeny.Tehat szvsz a szervereknel kene garazdalkodnod.

    Megoldas 01.
    elcsórod a leallitas menupontot a start menubol

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
    Itt letrehozol egy kulcsot Neve NoClose TipusReg_Dword erteke 1 és csak kijelentkezes menupont maradt.

    Megoldas 02.
    Figyeled a win uzeneteit es ha leallitas van kozbeavatkozol


    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private procedure WMQueryEndSession (var Msg : TWMQueryEndSession) ; message WM_QueryEndSession; Procedure WMEndSession (var Msg : TWMEndSession) ; message WM_ENDSESSION; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} //Amikor a felhasználó, vagy valamilyen alkalmazás a Windows-ból //való kilépésről, vagy újraindításról rendelkezik, //akkor az alkalmazások a WM_QURYENDSESSION eseményt kapják. //Ekkor eldönthetik, hogy engedélyezik-e a kilépést, //vagy nem. //Ez az esemény azonban pont emiatt nem közli az alkalmazással egyértelműen, //hogy a Windows befejezi futását, csak azt, hogy be szeretné fejezni. // Itt megakadalyozhato a leallitas is vagy kuldhetsz //uzit,majd ha vegeztel kodbol leallitod magad a szervert //forras softwareonline http://www.softwareonline.hu/Article/View.aspx?id=1224 procedure TForm1.WMQueryEndSession (var Msg : TWMQueryEndSession) ; begin if MessageDlg('Windows leállitása ?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then Msg.Result := 0 else Msg.Result := 1 ; end; //****************************************************** //Van azonban még egy üzenet, a WM_ENDSESSION, //amit viszont már akkor kap az alkalmazás, //amikor már biztos, hogy a Windows kilép. //Ehhez az üzenethez kell egy eljárást készíteni, //ami a szükséges feladatokat végrehajtja a program bezárása előtt. // procedure TForm1.WMEndSession (var Msg : TWMEndSession) ; begin if Msg.EndSession = TRUE then ShowMessage('Windows is shutting down ' + #10#13 + 'at ' + FormatDateTime('c', Now)) ; inherited; end; end.
    Mutasd a teljes hozzászólást!
  • Köszi szépen mégegyszer a válaszért !!!
    Bocsi, de csak 1 valakinek adhatok pontot... Máskor 2 külön topic-ban teszem fel inkább a kérdést...
    if FindWindow('FB_Guard', nil) <> 0 then Result := True;
    Ez tényleg hasznos kis sor, mindjárt ki is próbálom!
    Mutasd a teljes hozzászólást!
  • Gondolom megerőltető lett volna abba belegondolni, hogy a POST_EVENT-et tárolt eljárásból is ki lehet adni és a tárolt eljárást pedig a szerveren is meg lehet hívni a szükséges időben... a kliensek pedig megkapják.
    Mutasd a teljes hozzászólást!
  • Esetleg visszatartani valahogy a gépleállást


    Az általad elfogadott megoldás ezt a kérdést meríti ki. Mivel a kérdés azon része engem nem foglalkoztatott, ráhagytam azokra akiket igen. Viszont az eredeti elképzelésem az volt, hogy az általad elfogadott már megvalósított megoldásból üzenetet generálni (POST_EVENT alkalmazása tárolt eljárás hívásának segítségével).
    Mutasd a teljes hozzászólást!
  • kicsit sokat kellene hozzá gipszkartonozni...


    Igazad van! Ezt alaposan félreértettem.
    Mutasd a teljes hozzászólást!
  • FindWindow('FB_Server', nil)
    Az a vicces, hogy nekem mindig 0-át ad vissza, bármivel helyettesítem a stringet... 'FB_Guard', ... pedig fut a kicsike !
    bár én FB2.0.4-et használok.
    Honnan olvastad ki ezt az "FB_Server"-t?

    Találtam viszont egy török oldalon valami hasonlót, amivel meg lehet korrektül nézni fel van-e telepítve... már csak a futását kellene tényleg valahogy ellenőrizni. Íme a kód:

    program FbSvc; uses Forms, Registry, Windows, Messages, Dialogs, WinSvc, SysUtils; {$R *.RES} function GetPath: string; var regFirebird: TRegistry; begin Result := ''; regFirebird := TRegistry.Create; try regFirebird.RootKey := HKEY_LOCAL_MACHINE; if (regFirebird.OpenKeyReadOnly('Software\Firebird Project\Firebird Server\Instances') = True) then Result := Trim(regFirebird.ReadString('DefaultInstance')); finally regFirebird.CloseKey; regFirebird.Free; end; end; function IsNT: Boolean; var OSVersion: TOSVersionInfo; begin Result := False; OSVersion.dwOSVersionInfoSize := SizeOf(OSVersion); if (GetVersionEx(OSVersion)) then begin case OSVersion.dwPlatformID of VER_PLATFORM_WIN32_NT: Result := True; else Result := False; end; end; end; function StopServer: Boolean; var lHWND: HWND; sFirebirdPath, sExecName: string; lArray: array[0..255] of Char; begin Result := False; if (IsNT = True) then begin sFirebirdPath := GetPath; if (sFirebirdPath <> '') then begin sExecName := Format('%s%s', [sFirebirdPath, 'bin\instsvc.exe stop']); if (WinExec(StrPCopy(lArray, sExecName), 2) > 31) then Result := True; end; end else begin lHWND := FindWindow('FB_Server', 'Firebird Server'); if (PostMessage(lHWND, WM_CLOSE, 0, 0) <> Null) then Result := True; Application.ProcessMessages; end; end; function InstallAndStartGuardian: Boolean; var sFirebirdPath, sExecName: string; lArray: array[0..255] of Char; bResultInstall, bResultStart: Boolean; begin Result := False; if (IsNT = True) then begin sFirebirdPath := GetPath; if (sFirebirdPath <> '') then begin //service install sExecName := Format('%s%s', [sFirebirdPath, 'bin\instsvc.exe i -s -g -a']); if (WinExec(StrPCopy(lArray, sExecName), 2) > 31) then Result := True; end; end else begin bResultInstall := False; bResultStart := False; sFirebirdPath := GetPath; with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; if (OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False) = True) then begin WriteString('Firebird Guardian', sFirebirdPath + 'bin\fbguard.exe -a'); bResultInstall := True; end; finally CloseKey; Free; end; if (sFirebirdPath <> '') then begin sExecName := Format('%s%s', [sFirebirdPath, 'bin\fbguard.exe']); if (WinExec(StrPCopy(lArray, sExecName), 2) > 31) then bResultStart := True; end; if ((bResultInstall = True) and (bResultStart = True)) then Result := True; end; end; function StopAndDeinstallGuardian: Boolean; var lHWND: HWND; sFirebirdPath, sExecName: string; lArray: array[0..255] of Char; bResultDeInstall, bResultStop: Boolean; begin Result := False; if (IsNT = True) then begin sFirebirdPath := GetPath; if (sFirebirdPath <> '') then begin //service stop and uninstall sExecName := Format('%s%s', [sFirebirdPath, 'bin\instsvc.exe stop']); if (WinExec(StrPCopy(lArray, sExecName), 2) > 31) then begin sExecName := Format('%s%s', [sFirebirdPath, 'bin\instsvc.exe r']); if (WinExec(StrPCopy(lArray, sExecName), 2) > 31) then Result := True; end; end; end else begin bResultStop := False; bResultDeinstall := False; lHWND := FindWindow('FB_Server', 'Firebird Server'); if (PostMessage(lHWND, WM_CLOSE, 0, 0) <> Null) then bResultStop := True; Application.ProcessMessages; with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; if (OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False) = True) then bResultDeinstall := DeleteValue('Firebird Guardian'); finally CloseKey; Free; end; if ((bResultStop = True) and (bResultDeinstall = True)) then Result := True; end; end; var I: Byte; begin for I := 1 to ParamCount do begin if (UpperCase(ParamStr(I)) = '/INSTALL_GUARDIAN') then InstallAndStartGuardian; if (UpperCase(ParamStr(I)) = '/DEINSTALL_GUARDIAN') then StopAndDeinstallGuardian; if (UpperCase(ParamStr(I)) = '/STOP_SERVER') then StopServer; end; Application.Initialize; end.

    Mondjuk ez nem teljesen az amit keresek, hanem install/deinstall start/stop de hasznos kis kódcsipet
    Mutasd a teljes hozzászólást!
  • Már nem emlékszem pontosan, de ha minden igaz a telepítőből. Ha letöltöd a firebird forráskódját abban benne van a telepítő kódja is (1.5-nél innosetup volt) mintha abban láttam volna.

    A regisztris kiolvasást én is használom, ha például telepítve van a firebird, de régi verzió akkor le kell cserélni, ...
    Mutasd a teljes hozzászólást!
  • Azt megnezheted hogy szervizkent fut e

    openservice InterbaseServer

    link
    A szervizekrol

    Kugli elso talalat
    na ez badurl lett
    copypaste

    expert-exchange
    If there a way to determine if Interbase Server is running or not?

    prog hu
    Mutasd a teljes hozzászólást!
  • megkésve bár...
    A Firebird 2.5 Relase Notes alatt olvashat mindenki bővebben az
    fb_shutdown()
    parancsról.
    link


    Values for call mask: fb_shut_confirmation Engine queries: Is everyone ready to shut down? fb_shut_preproviders Actions to be done before providers are closed fb_shut_postproviders Actions to be done when providers are already closed fb_shut_finish Final cleanup
    ... már csak azt kellene tudni, melyik komponensen keresztül elérhetőek ezek a FB függvények?
    Mutasd a teljes hozzászólást!
abcd