перевод строки в time

Started by slako, January 01, 2016, 01:12:48 PM

Previous topic - Next topic

slako

Задача отлавливать подвисшие CLI php скрипты работающих на Win2003.
Process.CPUTime не подошел - если скрипт подвис и ничего не делает, то возвращаются значения 0.
Решил попробовать через
WMI.Query(root\CIMV2,\"select * FROM Win32_Process WHERE Name = 'php.exe'\", CreationDate)
Столкнулся с проблемой как сконвертировать значения этого запроса в объект time чтобы потом просчитать количество секунд которое прошло с начала старта? Значения приходят в виде 20160101235959.123123

Пробовал парсить как строку
rawdatetime = string($1);
tm_datetime = localtime();
tm_datetime<-year = int32(substr(rawdatetime,1,4));
tm_datetime<-mon = int32(substr(rawdatetime,5,2));
tm_datetime<-mday = int32(substr(rawdatetime,7,2));
tm_datetime<-hour = int32(substr(rawdatetime,9,2));
tm_datetime<-min = int32(substr(rawdatetime,11,2));
tm_datetime<-sec = int32(substr(rawdatetime,13,2));

но ругается на
Error 4 in line 3: Bad arithmetic conversion

Alex Kirhenshtein

Одна из проблем в синтаксисе:

tm_datetime<-year = int32(substr(rawdatetime,1,4));

должно быть

tm_datetime->year = int32(substr(rawdatetime,1,4));


Но основная проблема – в nxsl сейчас нет поддержки функции mktime.

slako

Quote from: Alex Kirhenshtein on January 01, 2016, 01:23:56 PM
Одна из проблем в синтаксисе:

tm_datetime<-year = int32(substr(rawdatetime,1,4));

должно быть

tm_datetime->year = int32(substr(rawdatetime,1,4));
Так тоже ругался
Error 15 in line 3: Unknown object's attribute


Quote from: Alex Kirhenshtein on January 01, 2016, 01:23:56 PM
Но основная проблема – в nxsl сейчас нет поддержки функции mktime.
точно, получается тогда пока никак.  :(

kozlov_ao

ну почему... можно руками вычислять. В одном из проектов тоже не было возможности работать со временем, ноо нужно было высчитывать промежуток между запусками, в минутах. Выкрутились таким вот вычислением:
LastRunMin+(LastRunHour*60)+(LastRunDay*LastRunHour*60)+(LastRunMon*LastRunDay*LastRunHour*60)+(LastRunYear*LastRunMon*LastRunDay*LastRunHour*60)
тут учтены переходы между днями, месяцами и годами.
да, это не timestamp.. это по сути вообще ничего :) но т.к. нужна была просто дельта по времени, этого вполне хватило.

slako

#4
А как при такой формуле определить делту в минутах?
Чего-то у меня значения дельты получаются не верны.
Скрипт такой
rawdatetime = string($1);
if(length(rawdatetime) >= 14)
{
starttime_year = format(substr(rawdatetime,1,4),1,0);
starttime_mon = format(substr(rawdatetime,5,2),1,0);
starttime_mday = format(substr(rawdatetime,7,2),1,0);
starttime_hour = format(substr(rawdatetime,9,2),1,0);
starttime_min = format(substr(rawdatetime,11,2),1,0);
trace(0,"PHP start time is " . starttime_year . "-" . string(starttime_mon) . "-" . starttime_mday . " " . starttime_hour . ":" . starttime_min);
starttime_ts = starttime_min+(starttime_hour*60)+(starttime_mday*starttime_hour*60)+(starttime_mon*starttime_mday*starttime_hour*60)+(starttime_year*starttime_mon*starttime_mday*starttime_hour*60);
trace(0,"starttime_ts is " . starttime_ts);
now = localtime();
now_year = now->year;
now_mon = now->mon+1;
now_mday = now->mday;
now_hour = now->hour;
now_min = now->min;
trace(0,"Now time is " . now_year . "-" . now_mon . "-" . now_mday . " " . now_hour . ":" . now_min);
now_ts = now_min+(now_hour*60)+(now_mday*now_hour*60)+(now_mon*now_mday*now_hour*60)+(now_year*now_mon*now_mday*now_hour*60);
trace(0,"now_ts is " . now_ts);
delta_min = now_ts - starttime_ts;
trace(0,"delta_min is " . delta_min);
return delta_min;
}
return false;


Результат:
[03-Jan-2016 12:52:39.587] [INFO ] PHP start time is 2016-1-3 10:30
[03-Jan-2016 12:52:39.587] [INFO ] starttime_ts is 3633030
[03-Jan-2016 12:52:39.587] [INFO ] Now time is 2016-1-3 12:52
[03-Jan-2016 12:52:39.587] [INFO ] now_ts is 4359652
[03-Jan-2016 12:52:39.587] [INFO ] delta_min is 726622


Или это абстрактная величина, которая будет едина для интервала?  К примеру мне нужно генерить эвент когда дельта больше 60 реальных минут.

kozlov_ao

Сейчас посмотрю... я уже не помню. дело было 2 года назад.

kozlov_ao

#6
Да, ступил я. В общем смотри:

LastRunTimestamp = LastRunMin+(LastRunHour*60)+(LastRunDay*LastRunHour*60)+(LastRunMon*LastRunDay*LastRunHour*60)+(LastRunYear*LastRunMon*LastRunDay*LastRunHour*60)
CurrRunTimestamp = CurrMin+(CurrHour*60)+(CurrDay*LastRunHour*60)+(CurrMon*LastRunDay*LastRunHour*60)+(CurrYear*LastRunMon*LastRunDay*LastRunHour*60)
if (CurrDay-LastRunDay==1 || CurrMon-LastRunMon==1 || CurrYear-LastRunYear==1){ // При переходе между сутками, месяцами и годами, делаем поправку
      CurrRunTimestamp = CurrRunTimestamp+60;
}
Delta=CurrRunTimestamp-LastRunTimestamp


Как это работает видно в приложенном файле.
На выходе получаешь реальную дельту в минутах.
Костыль тот еще, но лучше ничего не получалось придумать в тот момент.

slako