Во-первых, обратите внимание, что Вам не нужен вызов к grep
, между прочим: это может эффективно интегрироваться в awk
звонить.
<logfile awk '/endQuery/ {print $3 " " $1}'
Можно отфильтровать запрещенные запросы на этапе awk. Сохраните продолжающиеся запросы в массиве, удалите их, если они запрещаются и только распечатывают незапрещенные.
<logfile awk '
$2 == "startQuery" {q[$1]=1} # store the names of active queries
q[$1] && /banned/ {delete q[$1]} # delete banned queries
$2 == "endQuery" {
if (q[$1]) print $3, $1; # only report non-banned queries
delete q[$1];
}
' | sort -nr | head -n 3
Из того, что я вижу в источнике ядра, inotify действительно только разжигает после того, как запись завершается (т.е. Ваше предположение является неправильным). После того, как уведомление инициировано, еще только две вещи происходят в sys_write
, функция, которая реализует write
syscall: установка некоторых параметров планировщика и обновление позиции по дескриптору файла. Этот код еще был подобен 2.6.14. К этому времени огни уведомления файл уже имеет свой новый размер.
Проверьте на вещи, которые могут пойти не так, как надо:
stat
и затем вызовы read
или наоборот, что-то могло бы произойти промежуточное. Если Вы продолжаете добавлять в файл, звоня stat
первые гарантии, что Вы сможете считать, что далеко, но возможно, что больше данных было записано к этому времени, читатель звонит read
, даже если это еще не получило inotify уведомление.write
не означает, что ядро запишет требуемое количество символов. Существует очень немного обстоятельств, где атомарные записи гарантируются до любого размера. Каждый write
вызов гарантируется атомарный, однако: в какой-то момент данные еще не записаны, и затем внезапно n байты были записаны, где n является возвращаемым значением write
звонить. Если Вы наблюдаете частично записанный файл, это означает это write
возвращенные меньше, чем его аргумент размера.Полезные инструменты для исследования, что продолжается, включают:
strace -tt