Как добавить команду `watch 'в скрипт оболочки? - PullRequest
3 голосов
/ 20 августа 2011

У меня есть скрипт, который greps и awks и подсчитывает IP-адреса с несколькими кодами состояния http.Хотя на самом деле не имеет значения, что это за сценарий, потому что моя цель заключается в следующем:

Я хочу вызвать команду `watch 'внутри этого сценария, чтобы он обновлял отображение каждые несколько секунд новыми даннымиполученные из динамических журналов apache.

Я могу нормально вызвать мой скрипт следующим образом:

$ watch --no-title ./bad_request.sh

Но я бы предпочел иметь команду `watch 'внутри самого скрипта, чтобы сделать вызовскрипт из командной строки намного чище.

Вот скрипт:

#!/bin/bash
#identify repeated offenders through 401 and 403 status codes
  for ip in `awk '{print $1}' /var/log/apache2/* | sort -u`; do echo -n "$ip "; awk '{print $1 " " $9}' /var/log/apache2/* | egrep "( 401| 403)"| grep -c $ip; done | sort -k2 -r

Теперь я попытался просто вставить "watch -d --no-title" в скрипт,прямо перед циклом for, но он сердито ошибается.Я думаю, что это потому, что он только обрабатывает, пока не достигнет конца первой команды.Я также попытался поставить обратные тики и $ () по всему сценарию.Я также попытался сделать большую часть скрипта функцией bash и вызвать функцию watch.Никаких кубиков.

Есть идеи?

Кстати, я также открыт для улучшений сценария - я понимаю, что он немного избыточен / неэффективен.Конечно, это должно быть зарезервировано для другого вопроса переполнения стека.

Спасибо,

Кевин

РЕДАКТИРОВАТЬ: И еще одна вещь, я могу просто позвонить while true; do <bulk of script>; sleep 1; clear;но я ненавижу этоЭто работает, но экран мерцает, и это просто неправильный способ сделать это.

РЕДАКТИРОВАТЬ 2: Еще один неприятный способ взломать, это просто создать два сценария.Первый:

watch --no-title ./bad_request

А затем просто вызовите этот скрипт.Это работает нормально, но должен быть лучший способ.

РЕДАКТИРОВАТЬ 3 (извините ...): Я снял флаг -d с `watch '.Это не обязательно для моего сценария.

Ответы [ 3 ]

3 голосов
/ 20 августа 2011

Обратите внимание на философию Unix:

 A program should do one and only one thing and do it well.

Применительно к вашему делу:

A script should do one and only one thing and do it well.

Ваш "мерзкий взлом" на самом деле шаг в правильном направлении.* Вы никогда не узнаете, нужно ли вам когда-нибудь «смотреть --no-title» на другом скрипте.В этот момент, если вы будете следовать философии Unix, у вас уже будет скрипт для этого.

Вы уже видите одно усложнение попытки заставить скрипт делать слишком много вещей - процитировать ад.

Будьте проще.

1 голос
/ 20 августа 2011

правильное использование будет:

watch -d --no-title "/bin/bash for ip in `awk '{print $1}' /var/log/apache2/* | sort -u`; do echo -n "$ip "; awk '{print $1 " " $9}' /var/log/apache2/* | egrep '( 401| 403)'| grep -c $ip; done | sort -k2 -r"
0 голосов
/ 20 августа 2011

Помогает ли tail -f <file>?

мужской хвост

...