Возникла у меня задача – анализ работоспособности некоей службы, работающей на сервере. Служба собирает данные из нескольких источников и выдаёт их в виде 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 секунд:
Возможно, я не правильно понял сообщение об ошибке, буду благодарен за мысли на эту тему и/или алгоритм альтернативной реализации, особенно если они помогут обойти эту ошибку.