Расчет времени тандемного процесса
Буду очень признателен за помощь в определении того, как я могу рассчитать время, прошедшее с момента создания процесса Tandem (Nonstop).
Например: - я могу получить время создания процесса, когда я выполняю процедуру STATUS $, DETAIL и я получаю текстовое время в "Время создания процесса" - я хочу точно рассчитать, сколько времени прошло с момента создания процесса
Сначала я хотел получить текущее время с помощью #TIMESTAMP (или #JULIANTIMESTAMP), а затем преобразовать время создания текстового процесса в один из трех- или четырехсловного формата выше, а затем вычесть, чтобы найти разницу. После этого я преобразую эту разницу обратно в текстовую, чтобы узнать фактическое время.
У меня есть проблема в получении этого, чтобы точно вычислить... Цените любое руководство!
Спасибо!
1 ответ
Я думаю, что у вас есть правильная идея, похоже, нет точного способа (в TACL) получить время создания процесса, поэтому вам нужно обработать вывод команды status. Это не принимает переменную в качестве параметра OUTV, поэтому вы можете использовать файл и выполнить некоторую обработку там, а не в TACL.
Я преобразовал обе временные метки в разделенный пробелами список, который дает #CONTIME, а затем преобразовал их в юлианские временные метки (см. Ниже).
Это, вероятно, гораздо проще сделать в (скажем) C, где вы можете вызвать PROCESS_GETINFOLIST_, чтобы получить метку времени создания напрямую. Это может быть даже проще сделать в оболочке OSS, учитывая лучшую обработку там временных отметок.
?TACL ROUTINE
#FRAME
#PUSH tempfile
#SET tempfile XXTEMPXX
[#DEF MakeTimeList ROUTINE |BODY|
#FRAME
#PUSH month day year time hour min sec centi milli
SINK [#ARGUMENT/VALUE month/WORD]
SINK [#ARGUMENT/VALUE day/WORD]
SINK [#ARGUMENT COMMA]
SINK [#ARGUMENT/VALUE year/NUMBER]
SINK [#ARGUMENT/VALUE hour/NUMBER]
SINK [#ARGUMENT/VALUE min/NUMBER]
SINK [#ARGUMENT/VALUE sec/NUMBER]
SINK [#ARGUMENT/VALUE centi/NUMBER]
[#CASE [month]
|January| #SET month 1
|February| #SET month 2
|March| #SET month 3
|April| #SET month 4
|May| #SET month 5
|June| #SET month 6
|July| #SET month 7
|August| #SET month 8
|September| #SET month 9
|October| #SET month 10
|November| #SET month 11
|December| #SET month 12
]
#SET milli [#CHARGET centi 4 TO 6]
#SET centi [#CHARGET centi 1 TO 3]
#RESULT [year] [month] [day] [hour] [min] [sec] [centi] [milli]
#UNFRAME
]
#PUSH start now lines line pos process
SINK [#ARGUMENT/VALUE process/ PROCESSNAME]
[#IF NOT [#PROCESSEXISTS [process]] |THEN|
#OUTPUT [process] does not exist
]
status/out [tempfile]/[process],detail
edit [tempfile];cqab/:/ /a;cqab/./ /a;exit
filetovar [tempfile] lines
SINK [#PURGE [tempfile]]
#SET pos [#LINEFIND lines 1 Process Creation Time]
[#IF pos > 1 |THEN|
#SET line [#LINEGET lines [pos]]
#SET start [#CHARGET line 23 TO [#CHARCOUNT line]]
#SET start [MakeTimeList [start]]
#SETMANY start, [#COMPUTETIMESTAMP [start] ]
#SETMANY now, [#COMPUTETIMESTAMP [#CONTIME [#TIMESTAMP]] 0]
#OUTPUT [#COMPUTE ([now] - [start])/1000000] seconds have elapsed
]
#UNFRAME
TACL имеет действительно хорошие встроенные функции времени обработки, попробуйте следующее:
?tacl routine
#frame
[#push
inProcess processCreateTime timeRightNow
timeDifference aMicroSecond aMilliSecond
pctY pctM pctD pctH pctMI pctS pctMIL pctMIC
trnY trnM trnD trnH trnMI trnS trnMIL trnMIC
]
#setmany aMicroSecond aMilliSecond , 1000000 1000
#if [#argument/value inProcess/processid]
#set processCreateTime [#processinfo/processcreationtime/[inProcess]]
[#setmany _ pctY pctM pctD pctH pctMI pctS pctMIL pctMIC , [#interprettimestamp [processCreateTime]]]
#set timeRightNow [#juliantimestamp]
[#setmany _ trnY trnM trnD trnH trnMI trnS trnMIL trnMIC , [#interprettimestamp [timeRightNow]]]
#output Process [#shiftstring [inProcess]] create vs now times
#set timeDifference [#compute [timeRightNow] - [processCreateTime]]
#output Created: [pctY]-[pctM]-[pctD] [pctH]:[pctMI]:[pctS]
#output Time Now: [trnY]-[trnM]-[trnD] [trnH]:[trnMI]:[trnS]
#output Differences:
#output in micros: [timeDifference]
#output in mills: [#compute [timeDifference] / [aMilliSecond]]
#output in seconds: [#compute [timeDifference] / [aMicroSecond]]
#unframe