Периодически получайте новые строки из файла, возможно logrotated

Единственная ссылка на "Traceping", который я мог найти, была этим, который обращается к приложению для Android. В основном это выполняет a traceroute для обнаружения всех транзитных участков между местоположением и целевым IP, затем непрерывно проверяет с помощью ping-запросов каждый хост для предоставления Вам больше информации о качестве соединения.

Если Вы не поняли слова того, что я просто сказал, Вам, вероятно, не нужен инструмент.

Судя его описанием, если Вы хотите схожую функциональность в полной системе Linux, Ваш лучший выбор является MTR, который включен в в значительной степени каждое распределение, стоящее имени, которое активно не идет для абсолютно минимального места дискового пространства.

2
14.08.2013, 14:22
1 ответ

Принятие your-filter считывает его данные с stdin:

while your-filter; do
  sleep 60
done < file.log

Это принимает your-filter просто считывает данные и не пытается lseek в нем, например.

Теперь, для решения проблемы вращения журнала, если на Linux (где, вопреки большинству других систем, /dev/fd/n символьные ссылки на фактические файлы), с ksh, bash, zsh, dash, yash (большая часть POSIX окружает кроме наиболее педантично POSIX как posh как -ef не POSIX):

while your-filter; do
  if [ file.log -ef /dev/stdin ]; then
    sleep 60
  else
    exec < file.log
  fi
done < file.log

После вращения журнала, которое звонило бы your-filter дважды, если Вы быть бы то, чтобы он был названным однажды с конкатенацией старого и нового:

while 
  if [ file.log -ef /dev/stdin ]; then
    your-filter
  else
    exec 3<&0 < file.log
    (cat <&3; cat) | your-filter &&
      exec 3<&-
  fi
do
  sleep 60
done < file.log

Теперь после вращения журнала, может быть время, когда старый file.log был переименован, но новое file.log не созданный все же, в этом случае вышеупомянутое перестанет работать, если оно сделает exec < file.log в ту же минуту. Затем Вы могли зафиксировать это с:

while 
  if [ file.log -ef /dev/stdin ] || ! command exec 3< file.log; then
    your-filter
  else
    (cat; cat <&3) | your-filter &&
      exec <&3 3<&-
  fi
do
  sleep 60
done < file.log

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

command необходим для предотвращения exec заставить оболочку выходить, когда это перестало работать (поскольку POSIX требует). Это не нужно с zsh или bash если не в sh режим.

Теперь, мы спим в течение 60 секунд в цикле, и your-filter мог бы занять несколько секунд для выполнения. Если это важно для your-filter выполняться каждую минуту в среднем, с ksh, bash или zsh, Вы могли изменить его на:

t=$SECONDS
while 
  if [ file.log -ef /dev/stdin ] || ! command exec 3< file.log; then
    your-filter
  else
    (cat; cat <&3) | your-filter &&
      exec <&3 3<&-
  fi
do
  t=$(($t + 60))
  sleep "$((t - SECONDS))"
done < file.log

С ksh93 и zsh, и обеспеченный Ваш sleep принимает аргументы с плавающей точкой, Вы могли работать typeset -F SECONDS.

2
27.01.2020, 22:14
  • 1
    это - фантастический ответ, спасибо. Мне бы хотелось upvote несколько раз. Мало того, что это - полное решение того, что я спросил, я также как то, как это структурировано. Наконец - Ваш ответ заставил меня пойти и прочитать всю главу 20 tldp.org (перенаправление, должностное лицо, перенаправление блока) снова, и я чувствую себя несколько более умным теперь :-) Спасибо. –  Nitzan Shaked 14.08.2013, 20:15
  • 2
    Почему нет tail -F | while sleep 60; …? –  Gilles 'SO- stop being evil' 15.08.2013, 00:35
  • 3
    @Gilles, потому что your-filter заблокировался бы, поскольку это никогда не будет видеть конец файла. –  Stéphane Chazelas 15.08.2013, 00:37
  • 4
    Правда, Вам была бы нужна передача разделения сначала. Что-то основанное tail -F | while true; do timeout 60 cat | your-filter; done. Я получаю впечатление, что Вы повторно реализуете tail -F. (Мобильность могла быть причиной этого, конечно.) –  Gilles 'SO- stop being evil' 15.08.2013, 00:41
  • 5
    @Gilles - милый. Тайм-аут только для cat, чтобы заставить его прекратить читать, он - stdin, и сделать your-filter замеченный EOF, корректный? Btw, я думаю, что это не будет работать если logrotate перемещения file.log использование mv вместо того, чтобы копировать его и создать новый файл. tail не будет видеть, что файл переместился, корректный? –  Nitzan Shaked 15.08.2013, 08:03

Теги

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