@E_gorka
Сисадмин

Как с помощью awk вычислить разницу даты не потеряв всю «таблицу»?

Команда выводит какие задачи сейчас работают и когда эти задачи запущены.
# bjobs -u all -o "jobid user stat SUBMIT_TIME"
JOBID USER STAT SUBMIT_TIME
16188 chemicalinorg_serov RUN Aug 29 12:04
16286 aerohydromech RUN Sep 10 11:35
16287 ifmbmdcam RUN Sep 10 16:03
16283 KozlovaAS RUN Sep  8 13:32
16307 chemicalorg RUN Sep 13 14:37
16306 KozlovaAS RUN Sep 13 14:31

Требуется прикрутить мониторинг на zabbix, чтобы слались сообщения, когда задача выполняется слишком долго, более 10 дней. То есть нужно анализировать 4 и 5 столбцы, сравнивать с текущей датой и в случае разрыва более 10 дней отправлять алерт. Ничего умнее не придумал, как месяцы умножать на 30, прибавлять дни и получать количество дней от нового года
#DATENOW=$(date +%m:%d | awk -F ":" '{print ($1*30+$2)}')
#echo $DATENOW
284

По той же самой логике работаю с выводом:
# bjobs -u all -o "jobid user stat SUBMIT_TIME" | tail -n +2 | awk ' (system("date +%m:%d --date=\""$4 $5"\""))' | awk -F ":" '{print ($1*30+$2)}'
269
280
280
278
283
283
284

теперь сравниваем с нашей переменной DATENOW
# bjobs -u all -o "jobid user stat SUBMIT_TIME" | tail -n +2 | awk ' (system("date +%m:%d --date=\""$4 $5"\""))' | awk -F ":" '(('$DATENOW'-($1*30+$2)) > 10)' 
08:29

Все верно, самая первая строка "16188 chemicalinorg_serov RUN Aug 29 12:04" содержит дату старше нынешней (14 сентября) с дельтой более 10 дней.

Я не понимаю как в одном awk соединить преобразование даты (из Aug 29 в 08:29) и последующее вычисления дней (awk -F ":" '{print ($1*30+$2)}'), да еще без потери первых двух столбцов (jobid user).

Подскажите, пожалуйста.
  • Вопрос задан
  • 336 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Hanharr
Дату еще можно так преобразовать, возможно наведет на мысли

date -d "12:04 Aug 29" +%s
Ответ написан
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
Выше правильно сказали - преобразовывайте дату в timestamp и выполняйте любые сравнения.
Например можно вот так:

while read
do
  SUBMIT_DATE=$(echo $REPLY | awk -F "RUN" '{print $2}')
  declare -i DAYS=($(date "+%s")-$(date -d "$SUBMIT_DATE" "+%s"))/3600/24
  if [[ "$DAYS" -ge 10 ]]; then
    echo "This job was executed more than 10 days ago: $REPLY"
  fi
done <yourcommand
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы