Возникла у меня задача – анализ работоспособности некоей службы, работающей на сервере. Служба собирает данные из нескольких источников и выдаёт их в виде xml, при этом при отказе она выглядит работающей – отдаёт последний получившийся xml и значится запущенной, единствнное, что нашёл – строка в логе. Логи там небольшие, так что анализировать их легко. Соответственно, набросал программу, которая смотрит на новые строки лога и проверяет, не появилось ли там чего-то плохого, у меня на машине всё отработало как надо. Вот исходники:
- Код: Выделить всё
- program CheckRDM;
 {$mode objfpc}{$H+}
 uses
 {$IFDEF UNIX}{$IFDEF UseCThreads}
 cthreads,
 {$ENDIF}{$ENDIF}
 Crt, Classes, SysUtils, Dialogs, Process;
 { you can add units after this }
 VAR
 F1,F2, L:TextFile;
 I, N:Integer;
 S: STRING;
 P: TProcess;
 begin
 IF FileExists('C:RDMLogcopy_RDM[' + FormatDateTime('dd-mm-yyyy',Now) + '].log') THEN BEGIN
 Assign(F1, 'C:RDMLogRDM[' + FormatDateTime('dd-mm-yyyy',Now) + '].log');
 Assign(F2, 'C:RDMLogcopy_RDM[' + FormatDateTime('dd-mm-yyyy',Now) + '].log');
 Assign(L, 'c:RDMChecklog.txt');
 Reset(F1);
 Reset(F2);
 Append(L);
 N:=0;
 S:='';
 REPEAT
 ReadLn(F2,S);
 N:=N+1;
 until EoF(F2);
 Close(F2);
 Append(F2);
 For I:= 1 to N DO ReadLn(F1,S);
 WHILE NOT EoF(F1) DO BEGIN
 ReadLn(F1, S);
 IF Pos('GetIdleAgents [error]', S)>0 THEN BEGIN
 P := TProcess.Create(nil);
 P.CommandLine := 'c:RDMCheckbat.bat';
 P.Execute;
 P.Free;
 WriteLn(L, FormatDateTime('yyyy-mm-dd',Now)+' Servise restarted')
 end;
 WriteLn(F2, S)
 end;
 Close(F1);
 Close(F2);
 Close(L);
 end
 ELSE BEGIN
 FileCreate('C:RDMLogcopy_RDM[' + FormatDateTime('dd-mm-yyyy',Now) + '].log');
 Assign(F1, 'C:RDMLogRDM[' + FormatDateTime('dd-mm-yyyy',Now) + '].log');
 Assign(F2, 'C:RDMLogcopy_RDM[' + FormatDateTime('dd-mm-yyyy',Now) + '].log');
 Reset(F1);
 Rewrite(F2);
 S:='';
 WHILE NOT EoF(F1) DO BEGIN
 WriteLn(F1, S);
 ReadLn(F2, S);
 end;
 Close(F1);
 Close(F2);
 end;
 end.
Но вот незадача – на сервере уже я не могу её запустить – получаю такую ошибку:
- Код: Выделить всё
- C:RDMCheck>CheckRDM.exe
 An unhandled exception occurred at $00401D64 :
 EInOutError : Access denied
 $00401D64 main, line 54 of CheckRDM.lpr
На 54 строке инструкция «Reset(F1);» и более – ничего. То есть лог работающей программы оно получить не может – просто не может его открыть, хотя скриптовые языки, и система его открывают на лету.
Нашёл вот такую вещь в сети: http://delphiworld.narod.ru/base/open_r ... _file.html
Замена «Reset(F1);» на
- Код: Выделить всё
- F:=FileMode;
 FileMode=0;
 Reset(F1);
 FileMode:=F;
P.S. Пишу программы я редко, для себя, поэтому получается немного костыльно, но мне критично только что бы они работали и справлялись со своей задачей, отсюда и такой вид.
Добавлено спустя 21 час 58 минут 12 секунд:
Возможно, я не правильно понял сообщение об ошибке, буду благодарен за мысли на эту тему и/или алгоритм альтернативной реализации, особенно если они помогут обойти эту ошибку.




