К основному контенту

Weblogic Diagnostic Framework Run Bash Script (reboot managed server) - (bad practices)

Вообщем переодически сервер дохнет по: The WebLogic Server encountered a critical failure java.lang.OutOfMemoryError: Metaspace Reason: There is a panic condition in the server. The server is configured to exit on panic И хотя это гавно пишет типа  Reason: There is a panic condition in the server. The server is configured to exit on panic чёт ни хуя он ни куда не exit.... Вообщем т.к разбираться с тем чем он жрётся нет ни времени ни желания (оно обязательно появится)... как вариант можно приделать костыль... костыль будет заключаться в ребуте сервера при возникновении этой ошибки. Что значит для этого надо... Желания и понимание что так жить нельзя, и вообще... Делаем новый модуль называем скажем:  Reboot-OOMMetaSpace Идём в в новый модуль делаем Policy: Называем его OOM-Metaspace и говорит что это Server log: Жмём next в Configuration Policy пишем: log.logMessage.contains('java.lang.OutOfMemoryError: Metaspace'...

awk modify date format + awk in awk

Мы хотим преобразовывать буквенное (я бы даже сказал 3х буквенное) название месяца в числовое, например "Apr" в "4" и т.д
Очень интересное решение:
http://stackoverflow.com/questions/1158579/modification-of-date-format-within-a-text-file

Выглядит так:
$ echo |awk -v mon="SEP" '{mm=(index(":JAN:FEB:MAR:APR:MAY:JUN:JUL:AUG:SEP:OCT:NOV:DEC",mon)+2)/4; print mm}'
4

или

$ echo |awk -v mon="APR" '{mm=(index(":JAN:FEB:MAR:APR:MAY:JUN:JUL:AUG:SEP:OCT:NOV:DEC",mon)+2)/4; print mm}'
9

Гениально!!!=)

Там так же есть пояснение как это работает:

Text   Pos   +2   /4
----   ---   --   --
JAN      2    4    1
FEB      6    8    2
MAR     10   12    3
APR     14   16    4
MAY     18   20    5
JUN     22   24    6
JUL     26   28    7
AUG     30   32    8
SEP     34   36    9
OCT     38   40   10
NOV     42   44   11
DEC     46   48   12
В догонку:

Использование awk внутри awk:

Предположим мы хотим с помощью awk получить дату в seconds since 1970-01-01 00:00:00 UTC
В awk этим рулит функция 

mktime(datespec)
Turn datespec into a timestamp in the same form as is returned by systime(). It is similar to the function of the same name in ISO C. The argument, datespec, is a string of the form "YYYY MM DD HH MM SS [DST]". The string consists of six or seven numbers representing, respectively, the full year including century, the month from 1 to 12, the day of the month from 1 to 31, the hour of the day from 0 to 23, the minute from 0 to 59, the second from 0 to 60,54 and an optional daylight-savings flag.

На вход у нас есть строка вида: 127.0.0.1 - - [05/13/2014 02:15:53]
В качестве разделителя будем спользовать 3 символа -F[\]\[\ ]
1. ]
2. [ 
3. space (пробел)

В итоге выглядит так:
$ echo "127.0.0.1 - - [05/13/2014 02:15:53]" | awk -F[\]\[\ ] '{
> v=($5" "$6); 
> print v;
> split(v,fulldate," ");
> split(fulldate[1],date,"/");
> split(fulldate[2],time,":");
> filetime=mktime(date[3]" "date[1]" "date[2]" "time[1]" "time[2]" "time[3]);
> print filetime;}'
05/13/2014 02:15:53
1399932953
v=($5" "$6); - вырезаем необходимую дату 05/13/2014 02:15:53
split(v,fulldate," "); - формируем массив fulldate из переменной v разделитель " "(space)
т.е в массиве fulldate два элемента:
1. 05/13/2014
2. 02:15:53
Дальше по аналогии массив fulldate разбивается еще на два массива и 
результат сортируется так что бы его можно было скормить mktime


Комментарии